[스프링부트]2. Spring Boot & JMS & ActiveMQ 연동 및 테스트

[스프링부트]2. Spring Boot & JMS & ActiveMQ 연동 및 테스트

Spring Boot & JMS ActiveMQ 연동 및 테스트

준비물

ActiveMQ 클래식 버전 다운(https://activemq.apache.org/)

Postman

실행환경

sts 4(이클립스)

Spring-boot 2.6.1

1.ActiveMQ 다운

다운 후 activemq 를 눌러 실행시킨다.

콘솔에서 빨간줄을 확인하면 해당 주소로 접속이 가능하다고 나온다. 해당 주소로 접속한다. 접속시 아이디, 비번은 admin 이다.

해당 사이트로 접속하게 되고 해당 사이트에서 MQ를 모니터링 할 수 있는 것 같다.

2.의존성 추가

필자는 gradle을 사용중이다 의존성 추가를 해주자.

implementation 'org.springframework.boot:spring-boot-starter-activemq' compile("com.fasterxml.jackson.core:jackson-databind")

3.코드 작성

3-1. application.properties 작성

61616 이 ActivqMQ 의 기본 통신 포트이다.

server.port = 9091 activemq.broker.url=tcp://localhost:61616

3-2. SpringActiveMQConfig.java 작성

import javax.jms.Queue; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQQueue; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.core.JmsTemplate; @Configuration @EnableJms public class SpringActiveMQConfig { @Value("${activemq.broker.url}") private String brokerUrl; @Bean public Queue queue() { return new ActiveMQQueue("Yoon-ju-young-queue"); } @Bean public ActiveMQConnectionFactory activeMQConnectionFactory() { ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(); activeMQConnectionFactory.setBrokerURL(brokerUrl); return activeMQConnectionFactory; } @Bean public JmsTemplate jmsTemplate() { return new JmsTemplate(activeMQConnectionFactory()); } }

@Bean public Queue queue() { return new ActiveMQQueue("Yoon-ju-young-queue"); }

여기서 넣어주는 큐의 이름은 추후 통신 테스트 후 사이트 모니터에 등록됨을 확인할수 있다.

3.3 DTO Student.java 작성

import java.io.Serializable; public class Student implements Serializable { private static final long serialVersionUID = 1L; private String studentId; private String name; private String rollNumber; public String getStudentId() { return studentId; } public void setStudentId(String studentId) { this.studentId = studentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRollNumber() { return rollNumber; } public void setRollNumber(String rollNumber) { this.rollNumber = rollNumber; } }

3.4 Producer.java 컨트롤러 작성

Activemq Queue에 메시지는 보내는데 사용된다.

import javax.jms.Queue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.databind.ObjectMapper; @RestController @RequestMapping("/produce") public class Producer { @Autowired private JmsTemplate jmsTemplate; @Autowired private Queue queue; @PostMapping("/message") public Student sendMessage(@RequestBody Student student) { try { ObjectMapper mapper = new ObjectMapper(); String studentAsJson = mapper.writeValueAsString(student); jmsTemplate.convertAndSend(queue, studentAsJson); } catch (Exception e) { e.printStackTrace(); } return student; } }

3.5 Consumer.java

소비자 클래스는 ActiveMQ 대기열에서 메시지를 수신하는데 사용된다.

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer { private static final Logger logger = LoggerFactory.getLogger(Consumer.class); @JmsListener(destination = "Yoon-ju-young-queue") public void consumeMessage(String message) { logger.info("Message received from activemq queue---"+message); } }

@JmsListener(destination = "Yoon-ju-young-queue")

해당 목적지의 메시지를 읽는다는 주석이다. 자세한 내용은 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/annotation/JmsListener.html 침고

3.6 Application 클래스 작성

@SpringBootApplication @EnableJms @ComponentScan(basePackages = "com.example.*") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

3.7 실행 확인

실행포트가 9091로 돌아가는지 확인하자

4.Postman을 이용한 ActiveMQ 통신 테스트

JSON 타입의 데이터로 테스트를 진행한다.

{ "studentId": "20", "name": "rakesh", "rollNumber": "0126CS01" }

내가 보낸 데이터가 콘솔에서 소비자에 의해 읽힘을 확인할 수 있다.

현재는 생산자를 컨트롤러로 만들고 소비자를 리스너로 만들어 통신하는 방법이였다.

리스너에서 대기열의 메시지를 확인을 하면 맨 처음에 들어왔던 메시지를 확인하고 대기열에서 빠져 나가게 된다.

5.소비자를 리스너->클래스 형태로 만들어 통신해보자

5.1 NewConsumer.java

기존 리스너 형태의 소비자를 모두 주석처리 하여 콘솔에 메시지가 읽히지 않게 하고 새로운 소비자를 만들어서 생산자와 같이 컨트럴로 형태로 만들자.

import javax.jms.Queue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.databind.ObjectMapper; @RestController @RequestMapping("/consume") public class NewConsumer { @Autowired private JmsTemplate jmsTemplate; @Autowired private Queue queue; @GetMapping("/message") public Student consumeMessage() { Student student = null; try { ObjectMapper mapper = new ObjectMapper(); String jsonMessage = (String) jmsTemplate.receiveAndConvert(queue); student = mapper.readValue(jsonMessage, Student.class); } catch (Exception e) { e.printStackTrace(); } return student; } }

5.2 Postman을 이용한 소비자 컨트롤러 테스트

새로운 메시지를 대기열에 추가하고 컨트롤러를 통해서 읽어보자

-Postman을 통한 메시지 대기열 추가 전

-메시지 대기열 추가 후

대기열에 방금 내가 만든 메시지가 추가 되었음을 확인할 수 있다. 기존에 리스너 였으면 대기열에 있는 메시지를 바로바로 읽어서 콘솔에 찍어줬기 때문에 대기열에 항상 0이였지만 현재는 컨트롤러 형태로 만들어서 따로 읽어줘야 한다.

5.2 메시지 읽기 테스트

내가 방금 대기열에 추가한 메시지를 컨트롤러를 통해서 읽어보았다.

대기열에 있는 메시지를 읽었으니 당연히 1에서 0으로 변경됨을 모니터 사이트에서 확인할 수 있다.

참고

https://www.netsurfingzone.com/spring-boot/spring-boot-jms-activemq-producer-and-consumer-example/

https://spring.io/guides/gs/messaging-jms/

from http://pulpul8282.tistory.com/220 by ccl(A) rewrite - 2021-12-02 16:01:08