From 1ba5222e6dd2b65d0275b3403b495324c95b20a8 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 25 Nov 2018 16:29:19 +0700 Subject: [PATCH 1/2] add hystrix commands --- kanban-server/build.gradle | 3 ++ .../spring/hw/kanban/KanbanApplication.java | 18 ++++++++++ .../kanban/controllers/BoardController.java | 24 ++++++++++++++ .../kanban/controllers/StageController.java | 33 +++++++++++++++++++ .../hw/kanban/controllers/TaskController.java | 32 ++++++++++++++++++ .../hw/kanban/security/SecurityConfig.java | 2 +- .../hw/kanban/service/BoardServiceImpl.java | 7 ++++ .../src/main/resources/application.properties | 3 +- 8 files changed, 120 insertions(+), 2 deletions(-) diff --git a/kanban-server/build.gradle b/kanban-server/build.gradle index 5cbd60c..ab78af0 100644 --- a/kanban-server/build.gradle +++ b/kanban-server/build.gradle @@ -62,10 +62,13 @@ dependencies { compile 'org.springframework.security:spring-security-config:5.0.7.RELEASE' compile 'org.springframework:spring-context-support:5.0.7.RELEASE' compile 'net.sf.ehcache:ehcache-core:2.6.11' + compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix:2.0.2.RELEASE') // compile 'org.liquibase:liquibase-core:3.6.2' compile('org.springframework.boot:spring-boot-starter-data-jpa:1.5.8.RELEASE') + compile 'org.springframework.cloud:spring-cloud-starter-hystrix-dashboard:1.4.5.RELEASE' + compile 'org.springframework.boot:spring-boot-starter-actuator:2.0.5.RELEASE' runtime('com.h2database:h2') // All of your normal project dependencies would be here in addition to... diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/KanbanApplication.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/KanbanApplication.java index 4f098ff..4900076 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/KanbanApplication.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/KanbanApplication.java @@ -1,8 +1,14 @@ package ru.otus.spring.hw.kanban; +import com.netflix.hystrix.HystrixCommand; +import com.netflix.hystrix.HystrixCommandGroupKey; +import com.netflix.hystrix.HystrixCommandProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; +import org.springframework.cloud.netflix.hystrix.EnableHystrix; +import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.security.crypto.password.PasswordEncoder; import ru.otus.spring.hw.kanban.security.UserAccount; @@ -13,10 +19,22 @@ @SpringBootApplication(scanBasePackages = "ru.otus.spring.hw.kanban") @EnableJpaRepositories(basePackages = {"ru.otus.spring.hw.kanban.repository", "ru.otus.spring.hw.kanban.security"}) +@EnableCircuitBreaker +@EnableHystrix +@EnableHystrixDashboard public class KanbanApplication { public static void main(String[] args) { SpringApplication.run(KanbanApplication.class, args); + + HystrixCommand.Setter config = HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("boards")); + + HystrixCommandProperties.Setter properties = HystrixCommandProperties.Setter(); + properties.withExecutionTimeoutInMilliseconds(1000); + properties.withCircuitBreakerSleepWindowInMilliseconds(4000); + properties.withCircuitBreakerEnabled(true); + config.andCommandPropertiesDefaults(properties); + } diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/BoardController.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/BoardController.java index 42b254d..7397654 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/BoardController.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/BoardController.java @@ -1,10 +1,12 @@ package ru.otus.spring.hw.kanban.controllers; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import ru.otus.spring.hw.kanban.dto.BoardDTO; import ru.otus.spring.hw.kanban.service.BoardService; +import java.util.Collections; import java.util.List; @RestController @@ -19,28 +21,50 @@ public BoardController(BoardService boardService) { } @GetMapping(value = "/boards") + @HystrixCommand(groupKey = "boards", fallbackMethod = "findAllFallback") public List getBoards() { return boardService.findAll(); } @PostMapping("/boards") + @HystrixCommand(groupKey = "boards", fallbackMethod = "createFallback") BoardDTO newBoard(@RequestBody BoardDTO newBoard) { return boardService.create(newBoard); } @GetMapping("/boards/{id}") + @HystrixCommand(groupKey = "boards", fallbackMethod = "findFallback") public BoardDTO getBoard(@PathVariable int id) { return boardService.find(id); } @PutMapping("/boards/{id}") + @HystrixCommand(groupKey = "boards", fallbackMethod = "updateFallback") BoardDTO updateBoard(@RequestBody BoardDTO boardDTO, @PathVariable Long id) { return boardService.update(boardDTO); } @DeleteMapping("/boards/{id}") + @HystrixCommand(groupKey = "boards") void deleteBoard(@PathVariable int id) { boardService.deleteById(id); } + public List findAllFallback() { + return Collections.emptyList(); + } + + public BoardDTO findFallback(int id) { + return null; + } + + public BoardDTO createFallback(BoardDTO newBoard) + { + return null; + } + + public BoardDTO updateFallback(BoardDTO boardToUpdate) { + return null; + } + } diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/StageController.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/StageController.java index 5406720..f92698c 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/StageController.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/StageController.java @@ -1,10 +1,12 @@ package ru.otus.spring.hw.kanban.controllers; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import ru.otus.spring.hw.kanban.dto.StageDTO; import ru.otus.spring.hw.kanban.service.StageService; +import java.util.Collections; import java.util.List; @RestController @@ -19,33 +21,64 @@ public StageController(StageService stageService) { } @GetMapping(value = "/stages") + @HystrixCommand(groupKey = "stages", fallbackMethod = "findAllFallback") public List getStages() { return stageService.findAll(); } @GetMapping(value = "/boards/{id}/stages") + @HystrixCommand(groupKey = "stages", fallbackMethod = "findAllByBoardFallback") public List getStagesByBoard(@PathVariable int id) { return stageService.findByBoard(id); } @PostMapping("/stages") + @HystrixCommand(groupKey = "stages", fallbackMethod = "createStageFallback") StageDTO newStage(@RequestBody StageDTO newStage) { return stageService.create(newStage); } @GetMapping("/stages/{id}") + @HystrixCommand(groupKey = "stages", fallbackMethod = "getStageFallback") public StageDTO getStage(@PathVariable int id) { return stageService.find(id); } @PutMapping("/stages/{id}") + @HystrixCommand(groupKey = "stages", fallbackMethod = "updateStageFallback") StageDTO updateStage(@RequestBody StageDTO stageDTO, @PathVariable Long id) { return stageService.update(stageDTO); } @DeleteMapping("/stages/{id}") + @HystrixCommand(groupKey = "stages", fallbackMethod = "deleteStageFallback") void deleteStage(@PathVariable int id) { stageService.deleteById(id); } + + public List findAllFallback() { + return Collections.emptyList(); + } + + public List findAllByBoardFallback(int id) { + return Collections.emptyList(); + } + + StageDTO createStageFallback(StageDTO newStage) { + return null; + } + + + public StageDTO getStageFallback(int id) { + return null; + } + + StageDTO updateStageFallback(StageDTO stageDTO, Long id) { + return null; + } + + void deleteStageFallback(int id) { + + } } diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java index 040eb0b..f3275c9 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java @@ -1,5 +1,6 @@ package ru.otus.spring.hw.kanban.controllers; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PostFilter; import org.springframework.security.access.prepost.PreFilter; @@ -8,6 +9,7 @@ import ru.otus.spring.hw.kanban.service.TaskService; import java.security.Principal; +import java.util.Collections; import java.util.List; @RestController @@ -22,33 +24,63 @@ public TaskController(TaskService taskService) { @GetMapping(value = "/stages/{id}/tasks") @PostFilter("hasPermission(filterObject,'READ')") + @HystrixCommand(groupKey = "tasks", fallbackMethod = "findAllByStageFallback") public List getTasksByStage(@PathVariable int id) { return taskService.findAllByStage(id); } @GetMapping(value = "/tasks") + @HystrixCommand(groupKey = "tasks", fallbackMethod = "findAllFallback") public List getTasks() { return taskService.findAll(); } @PostMapping("/tasks") + @HystrixCommand(groupKey = "tasks", fallbackMethod = "createFallback") TaskDTO newTask(Principal principal, @RequestBody TaskDTO newTask) { newTask.username = principal.getName(); return taskService.create(newTask); } @GetMapping("/tasks/{id}") + @HystrixCommand(groupKey = "tasks", fallbackMethod = "getTaskFallback") public TaskDTO getTask(@PathVariable int id) { return taskService.find(id); } @PutMapping("/tasks/{id}") + @HystrixCommand(groupKey = "tasks", fallbackMethod = "updateTaskFallback") TaskDTO updateTask(@RequestBody TaskDTO taskDTO, @PathVariable Long id) { return taskService.update(taskDTO); } @DeleteMapping("/tasks/{id}") + @HystrixCommand(groupKey = "tasks") void deleteTask(@PathVariable int id) { taskService.deleteById(id); } + + + + public List findAllByStageFallback(int id) { + return Collections.emptyList(); + } + + public List findAllFallback() { + return Collections.emptyList(); + } + + TaskDTO createFallback(Principal principal, TaskDTO newTask) { + return null; + } + + + public TaskDTO getTaskFallback(int id) { + return null; + } + + TaskDTO updateTaskFallback(TaskDTO taskDTO, Long id) { + return null; + } + } diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/security/SecurityConfig.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/security/SecurityConfig.java index 8608440..c0c8d65 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/security/SecurityConfig.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/security/SecurityConfig.java @@ -32,7 +32,7 @@ protected void configure(HttpSecurity http) throws Exception { .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.ACCEPTED)).and() .httpBasic().and() .authorizeRequests() - .antMatchers("/login", "/", "/index.html", "/css/**").permitAll() + .antMatchers("/login", "/", "/index.html", "/css/**", "**/actuator/**").permitAll() .antMatchers(HttpMethod.POST, "/user").permitAll() .anyRequest().authenticated(); diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/service/BoardServiceImpl.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/service/BoardServiceImpl.java index 153d162..c0209e5 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/service/BoardServiceImpl.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/service/BoardServiceImpl.java @@ -1,5 +1,6 @@ package ru.otus.spring.hw.kanban.service; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.otus.spring.hw.kanban.domain.Board; @@ -8,6 +9,7 @@ import ru.otus.spring.hw.kanban.repository.BoardRepository; import javax.transaction.Transactional; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -21,10 +23,12 @@ public BoardServiceImpl(BoardRepository boardRepository) { this.boardRepository = boardRepository; } + public List findAll() { return boardRepository.findAll().stream().map(BoardDTO::fromBoard).collect(Collectors.toList()); } + public BoardDTO find(int id) { Board board = boardRepository.findById(id) .orElseThrow(() -> new BoardNotFoundException("Board with " + id + " not found.")); @@ -51,4 +55,7 @@ public BoardDTO update(BoardDTO boardToUpdate) { public void deleteById(int id) { boardRepository.deleteById(id); } + + + } diff --git a/kanban-server/src/main/resources/application.properties b/kanban-server/src/main/resources/application.properties index c9e7a13..4ac519c 100644 --- a/kanban-server/src/main/resources/application.properties +++ b/kanban-server/src/main/resources/application.properties @@ -9,4 +9,5 @@ spring.datasource.username=sa spring.datasource.password= spring.jpa.hibernate.ddl-auto=none logging.level.org.springframework.security=DEBUG -#server.port=8090 \ No newline at end of file +#server.port=8090 +management.endpoints.web.exposure.include: hystrix.stream \ No newline at end of file From 35ae6b8f0a316c2fe49a65b3d0844ff5ecdc793d Mon Sep 17 00:00:00 2001 From: Denis Date: Mon, 26 Nov 2018 22:36:27 +0700 Subject: [PATCH 2/2] add sync --- kanban-server/build.gradle | 4 ++ .../spring/courseproject/yag/dto/TaskDTO.java | 29 ++++++++++ .../otus/spring/hw/kanban/aop/JMSAudit.java | 56 +++++++++++++++++++ .../hw/kanban/controllers/TaskController.java | 2 +- .../spring/hw/kanban/messaging/JMSConfig.java | 19 +++++++ .../hw/kanban/messaging/JmsProperties.java | 21 +++++++ .../hw/kanban/messaging/ProjectTaskDTO.java | 20 +++++++ .../hw/kanban/messaging/TaskReciever.java | 54 ++++++++++++++++++ .../src/main/resources/application.properties | 15 ++++- package.json | 2 +- proxy.conf.json | 2 +- 11 files changed, 220 insertions(+), 4 deletions(-) create mode 100644 kanban-server/src/main/java/ru/otus/spring/courseproject/yag/dto/TaskDTO.java create mode 100644 kanban-server/src/main/java/ru/otus/spring/hw/kanban/aop/JMSAudit.java create mode 100644 kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JMSConfig.java create mode 100644 kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JmsProperties.java create mode 100644 kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/ProjectTaskDTO.java create mode 100644 kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/TaskReciever.java diff --git a/kanban-server/build.gradle b/kanban-server/build.gradle index ab78af0..8364ace 100644 --- a/kanban-server/build.gradle +++ b/kanban-server/build.gradle @@ -71,6 +71,10 @@ dependencies { compile 'org.springframework.boot:spring-boot-starter-actuator:2.0.5.RELEASE' runtime('com.h2database:h2') + implementation('org.springframework.boot:spring-boot-starter-activemq') + implementation('org.springframework.boot:spring-boot-starter-aop') + + // All of your normal project dependencies would be here in addition to... // liquibaseRuntime 'org.liquibase:liquibase-core:3.6.1' // liquibaseRuntime 'org.liquibase:liquibase-groovy-dsl:2.0.1' diff --git a/kanban-server/src/main/java/ru/otus/spring/courseproject/yag/dto/TaskDTO.java b/kanban-server/src/main/java/ru/otus/spring/courseproject/yag/dto/TaskDTO.java new file mode 100644 index 0000000..d47aa89 --- /dev/null +++ b/kanban-server/src/main/java/ru/otus/spring/courseproject/yag/dto/TaskDTO.java @@ -0,0 +1,29 @@ +package ru.otus.spring.courseproject.yag.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.format.DateTimeFormatter; + +@Data +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class TaskDTO { + + private long id; + @JsonProperty("start_date") + private String startDate; + @JsonProperty("text") + private String description; + private double progress; + private int duration; + private Long parent; + private Long project; + private String executor; + + +} diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/aop/JMSAudit.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/aop/JMSAudit.java new file mode 100644 index 0000000..6d65055 --- /dev/null +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/aop/JMSAudit.java @@ -0,0 +1,56 @@ +package ru.otus.spring.hw.kanban.aop; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Parameter; +import java.util.stream.IntStream; + +@Aspect +@Component +public class JMSAudit { + private static final String DASH_LINE = "==================================="; + private static final String NEXT_LINE = "\n"; + private static final Logger log =LoggerFactory.getLogger("JMSAudit"); + + @Pointcut("execution(* ru.otus.spring.hw.kanban.messaging.*.*(..))") + public void logJms(){}; + + @Around("logJms()") + public Object jmsAudit(ProceedingJoinPoint pjp) throws Throwable{ + Object[] args = pjp.getArgs(); + Parameter[] parameters = ((MethodSignature)pjp.getSignature()).getMethod().getParameters(); + + StringBuilder builder = new StringBuilder(NEXT_LINE); + builder.append(DASH_LINE); + builder.append(NEXT_LINE); + builder.append("[BEFORE]"); + builder.append(NEXT_LINE); + builder.append("Method: "); + builder.append(pjp.getSignature().getName()); + builder.append(NEXT_LINE); + builder.append("Params: "); + builder.append(NEXT_LINE); + IntStream.range(0,args.length).forEach(index -> { + builder.append("> "); + builder.append(parameters[index].getName()); + builder.append(": "); + builder.append(args[index]); + builder.append(NEXT_LINE); + }); + builder.append(DASH_LINE); + log.info(builder.toString()); + + Object object = pjp.proceed(args); + + //Some Extra logging [AFTER] + + return object; + } +} \ No newline at end of file diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java index f3275c9..38eb492 100644 --- a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/controllers/TaskController.java @@ -23,7 +23,7 @@ public TaskController(TaskService taskService) { } @GetMapping(value = "/stages/{id}/tasks") - @PostFilter("hasPermission(filterObject,'READ')") +// @PostFilter("hasPermission(filterObject,'READ')") @HystrixCommand(groupKey = "tasks", fallbackMethod = "findAllByStageFallback") public List getTasksByStage(@PathVariable int id) { return taskService.findAllByStage(id); diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JMSConfig.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JMSConfig.java new file mode 100644 index 0000000..6e18971 --- /dev/null +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JMSConfig.java @@ -0,0 +1,19 @@ +package ru.otus.spring.hw.kanban.messaging; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.support.converter.MappingJackson2MessageConverter; +import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.converter.MessageType; + +@Configuration +public class JMSConfig { + + @Bean + public MessageConverter jacksonJmsMessageConverter() { + MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); + converter.setTargetType(MessageType.TEXT); + converter.setTypeIdPropertyName("_class_"); // This value can be anything, it will save the JSON class name and it must be the same for sender/receiver + return converter; + } +} diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JmsProperties.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JmsProperties.java new file mode 100644 index 0000000..da49cac --- /dev/null +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/JmsProperties.java @@ -0,0 +1,21 @@ +package ru.otus.spring.hw.kanban.messaging; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +@Data +public class JmsProperties { + + @Value("${jms.queue}") + private String jmsQueueName; + + @Value("${jms.task-queue}") + private String jmsTaskQueueName; + + @Value("${jms.task-reply-queue}") + private String jmsTaskReplyQueueName; + + +} diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/ProjectTaskDTO.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/ProjectTaskDTO.java new file mode 100644 index 0000000..e144574 --- /dev/null +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/ProjectTaskDTO.java @@ -0,0 +1,20 @@ +package ru.otus.spring.hw.kanban.messaging; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class ProjectTaskDTO { + + private long id; + @JsonProperty("start_date") + private String startDate; + @JsonProperty("text") + private String description; + private double progress; + private int duration; + private Long parent; + private Long project; + private String executor; + +} diff --git a/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/TaskReciever.java b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/TaskReciever.java new file mode 100644 index 0000000..2adf4c1 --- /dev/null +++ b/kanban-server/src/main/java/ru/otus/spring/hw/kanban/messaging/TaskReciever.java @@ -0,0 +1,54 @@ +package ru.otus.spring.hw.kanban.messaging; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.messaging.Message; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Component; +import ru.otus.spring.courseproject.yag.dto.TaskDTO; +import ru.otus.spring.hw.kanban.domain.Board; +import ru.otus.spring.hw.kanban.domain.Stage; +import ru.otus.spring.hw.kanban.domain.Task; +import ru.otus.spring.hw.kanban.repository.BoardRepository; +import ru.otus.spring.hw.kanban.repository.StageRepository; +import ru.otus.spring.hw.kanban.repository.TaskRepository; + +import javax.transaction.Transactional; + +@Component +public class TaskReciever { + + @Autowired + TaskRepository taskRepository; + + @Autowired + BoardRepository boardRepository; + + @Autowired + StageRepository stageRepository; + + + @JmsListener(destination = "jms-tasks-queue") + @SendTo("jms.task-reply-queue") + @Transactional + public Message processTask(TaskDTO task) { + + System.out.println("processTask called " + task); + Board board = boardRepository.findAll().get(0); + Stage stage = stageRepository.findStagesByBoard(board).get(0); + + // create task and return any id + Task kanbanTask = new Task(); + kanbanTask.setName(task.getDescription()); + kanbanTask.setStage(stage); + + taskRepository.save(kanbanTask); + + + return MessageBuilder + .withPayload("PROCCESSED") + .setHeader("ID", task.getId()) + .build(); + } +} diff --git a/kanban-server/src/main/resources/application.properties b/kanban-server/src/main/resources/application.properties index 4ac519c..31562b7 100644 --- a/kanban-server/src/main/resources/application.properties +++ b/kanban-server/src/main/resources/application.properties @@ -10,4 +10,17 @@ spring.datasource.password= spring.jpa.hibernate.ddl-auto=none logging.level.org.springframework.security=DEBUG #server.port=8090 -management.endpoints.web.exposure.include: hystrix.stream \ No newline at end of file +management.endpoints.web.exposure.include: hystrix.stream + + +#Default ActiveMQ properties +spring.activemq.broker-url=tcp://172.17.0.2:61616 +spring.activemq.user=admin +spring.activemq.password=admin + +#Apress Configuration +jms.queue=jms-queue +jms.task-queue=jms-tasks-queue +jms.task-reply-queue=jms-tasks-queue-reply + +server.port=8090 \ No newline at end of file diff --git a/package.json b/package.json index 1ed348f..d4cd01d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "MIT", "scripts": { "ng": "ng", - "start": "ng serve --proxy-config proxy.conf.json", + "start": "ng serve --proxy-config proxy.conf.json --port 4300", "build": "ng build --prod", "test": "ng test", "lint": "ng lint", diff --git a/proxy.conf.json b/proxy.conf.json index 6ad1a57..6a3abab 100644 --- a/proxy.conf.json +++ b/proxy.conf.json @@ -1,6 +1,6 @@ { "/api/*": { - "target": "http://localhost:8080", + "target": "http://localhost:8090", "secure": false, "logLevel": "debug", "changeOrigin": true