Apache Artemis - SpringBoot Artemis 애플리케이션으로 JMS 메시지를 생성/소비하는 방법.

https://grokonez.com/spring-framework/spring-jms/apache-artemis-produceconsume-jms-messages-springboot-artemis-applications

Apache ActiveMQ Artemis는 ActiveMQ/HornetQ/Apollo의 결합된 기능 세트입니다. 뛰어난 성능을 위한 논블로킹 아키텍처를 제공합니다. 따라서 자습서JavaSampleApproach에서 다음을 수행하는 방법을 안내합니다.
SpringBoot Artemis 애플리케이션으로 JMS 생산자/소비자를 생성합니다.

관련 게시물:
  • Spring JMS with ActiveMQ – JMS Consumer and JMS Producer | Spring Boot
  • Spring Apache Kafka Application with SpringBoot Auto-Configuration
  • Spring RabbitMQ Producer/Consumer applications with SpringBoot

  • I. 기술



    – 자바 8
    – 메이븐 3.6.1
    – Spring 도구 모음: 버전 3.8.4.RELEASE
    – 스프링 부트: 1.5.4.RELEASE
    – 아파치 아르테미스 2.1.0

    II. 스프링부트 아르테미스



    1. SpringBoot 자동 구성



    클래스 경로에 artemis-jms-client Artemis가 있는 경우 Spring Boot는 ConnectionFactory를 자동 구성할 수 있습니다.
    Artemis 구성을 제어하기 위해 spring.artemis.*를 사용합니다.
    
    spring.artemis.mode=native
    spring.artemis.host=localhost
    spring.artemis.port=61616
    spring.artemis.user=jsa
    spring.artemis.password=12345
    
    spring.artemis.mode에는 2가지 모드가 있습니다: {NATIVE, EMBEDDED}:

  • 네이티브: 네이티브 Artemis 프로토콜을 사용하여 브로커에 연결합니다.

  • EMBEDDED: 응용 프로그램에 브로커를 포함합니다.

    2. 메시지 송수신


    메시지 전송을 위해 다음을 사용합니다. JmsTemplate jmsTemplate
  • 
    @Component
    public class ArtemisProducer {
        @Autowired
        JmsTemplate jmsTemplate;
        
        @Value("${jms.queue.destination}")
        String destinationQueue;
        
        public void send(String msg){
            jmsTemplate.convertAndSend(destinationQueue, msg);
        }
    }
    

    수신된 메시지의 경우 다음을 사용합니다. @JmsListener :
    
    @Component
    public class ArtemisConsumer {
        
        @JmsListener(destination = "${jms.queue.destination}")
        public void receive(String msg){
            System.out.println("Recieved Message: " + msg);
        }
    }
    

    3. SpringBoot 아르테미스 애플리케이션



    튜토리얼에서는 생산자/소비자를 위한 2개의 SpringBoot Artemis 프로젝트를 생성합니다.



    III. 관행



    2개의 SpringBoot 프로젝트 {SpringBootArtemisProducer, SpringBootArtemisConsumer}를 만듭니다.



    할 단계:
  • SpringBoot 프로젝트 생성
  • Artemis 생산자/소비자 구현
  • 아르테미스 배치
  • 실행 및 결과 확인

    1. Spring Boot 프로젝트 생성


    SpringToolSuite를 사용하여 2개의 SpringBoot 프로젝트({SpringBootArtemisProducer, SpringBootArtemisConsumer})를 생성합니다.

  • SpringBootArtemisProducer의 경우 종속성을 추가합니다.
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-artemis</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    SpringBootArtemisConsumer의 경우 종속성을 추가합니다.
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>artemis-jms-client</artifactId>
        <version>2.1.0</version>
    </dependency>

    SpringBootArtemisProducer에 artemis-jms-client 2.1.0를 사용하지 않는 이유는 무엇입니까?
    -> 튜토리얼을 할 때 artemis-jms-client 2.1.0jmsTemplate.convertAndSend에 대한 버그가 있습니다. 예외는 다음과 같습니다.
    
    java.lang.NoSuchMethodError: org.apache.activemq.artemis.api.core.client.ClientMessage.setUserID(Ljava/lang/Object;)Lorg/apache/activemq/artemis/api/core/Message;
        at org.apache.activemq.artemis.jms.client.ActiveMQMessageProducer.doSendx(ActiveMQMessageProducer.java:469) ~[artemis-jms-client-2.1.0.jar:2.1.0]
        at org.apache.activemq.artemis.jms.client.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:191) ~[artemis-jms-client-2.1.0.jar:2.1.0]
        at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:626) ~[spring-jms-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:597) ~[spring-jms-4.3.10.RELEASE.jar:4.3.10.RELEASE]
        at org.springframework.jms.core.JmsTemplate$4.doInJms(JmsTemplate.java:574) ~[spring-jms-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    

    Artemis 소비자spring-boot-starter-artemis - version 1.5.6artemis-jms-client 1.5.5(@JmsListener 포함)를 사용하지 않는 이유는 무엇입니까?
    -> 버그가 생겼기 때문에:
    
    Setup of JMS message listener invoker failed for destination 'JSA-QUEUE' - trying to recover. Cause: AMQ119019: Queue already exists JSA-QUEUE
    

    메모:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-artemis</artifactId>
        <version>1.5.6.RELEASE</version>
    </dependency>
    </pre>
    
    <strong>EQUAL TO</strong>:
    
    <pre class="lang:xhtml">
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>4.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>artemis-jms-client</artifactId>
        <version>1.5.5</version>
    </dependency>

    2. Artemis 생산자/소비자 구현



    위 프로젝트의 경우 application.properties 파일을 열고 Artemis 구성을 추가합니다.
    
    spring.artemis.mode=native
    spring.artemis.host=localhost
    spring.artemis.port=61616
    spring.artemis.user=jsa
    spring.artemis.password=12345
    jms.queue.destination=JSA-QUEUE
    

    2.1 Artemis 생산자 구현


    JmsTemplate를 사용하여 ArtemisProducer 구현:
    
    package com.javasampleapproach.artemis.jms;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ArtemisProducer {
        @Autowired
        JmsTemplate jmsTemplate;
        
        @Value("${jms.queue.destination}")
        String destinationQueue;
        
        public void send(String msg){
            jmsTemplate.convertAndSend(destinationQueue, msg);
        }
    }
  • 메시지 전송을 위한 간단한 RestApi 생성:
  • 
    package com.javasampleapproach.artemis.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.javasampleapproach.artemis.jms.ArtemisProducer;
    
    @RestController
    public class RestApiController {
        
        @Autowired
        ArtemisProducer producer;
        
        @RequestMapping(value="/produce")
        public String produce(@RequestParam("msg")String msg){
            producer.send(msg);
            return "Done";
        }
    }
    

    2.2 Artemis 소비자 구현


    @JmsListener를 사용하여 ArtemisConsumer 구현:
    
    package com.javasampleapproach.artemis.jms;
    
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ArtemisConsumer {
        
        @JmsListener(destination = "${jms.queue.destination}")
        public void receive(String msg){
            System.out.println("Recieved Message: " + msg);
        }
    }
    

    3. 아르테미스 배포



    Artemis download page으로 이동합니다. 아르테미스 2.1.0 다운로드:



    apache-artemis-2.1.0-bin.zip을 추출하면 다음이 있습니다.



    명령줄로 Artemis 브로커 jsa-springboot-broker를 만듭니다.C:\apache-artemis-2.1.0\bin>artemis create "C:\dev\jsa-springboot-broker" :



    명령줄로 Artemis 브로커 실행: "C:\dev\jsa-springboot-broker\bin\artemis" run


    4. 실행 및 결과 확인



    명령줄을 사용하여 SpringBoot 프로젝트 위에서 빌드 및 실행: { mvn clean install , mvn spring-boot:run }
  • 전송 요청을 만드십시오: http://localhost:8080/produce?msg=JSA - SpringBoot Artemis, Hello World! . 결과:

  • -> jconsole.exe를 사용하여 Artemis 대기열에 추가된 메시지를 모니터링합니다.



    -> Artemis 소비자의 로그:
    
    Recieved Message: JSA - SpringBoot Artemis, Hello World!
    

    IV. 소스 코드



    SpringBootArtemisProducer
    SpringBootArtemisConsumer

    https://grokonez.com/spring-framework/spring-jms/apache-artemis-produceconsume-jms-messages-springboot-artemis-applications

    좋은 웹페이지 즐겨찾기