Guide_Messaging with JMS

Dev.Hammy·2023년 12월 15일
0

Spring Guides

목록 보기
11/46

이 가이드는 JMS 브로커를 사용하여 메시지를 게시하고 구독하는 과정을 안내합니다.

메시지 브로커와 미들웨어

1. 메시지, Topic, Queue 개념 요약:

  • 메시지(Message): 데이터 교환을 위한 패킷. 일반적으로 구조화된 데이터 형태로 전달되며, 시스템 간 통신을 위한 정보를 포함합니다.

  • Queue: 메시지가 저장되는 곳으로, 한 송신자가 보낸 메시지는 하나 이상의 수신자에게 전달됩니다. 일반적으로 'FIFO(First In, First Out)' 방식으로 메시지를 처리합니다.

  • Topic: Publish/Subscribe 패턴에서 사용됩니다. 메시지는 Topic으로 발행되며, 해당 Topic을 구독하는 모든 수신자가 해당 메시지를 수신합니다. 이는 특정 주제나 키워드에 관심이 있는 수신자들에게 메시지를 전송하는 데 사용됩니다.

2. 대략적인 구조

  • POJO(Plain Old Java Object): 메시지의 내용을 표현하는 데 사용됩니다. 이는 데이터를 담고 있는 단순한 자바 객체입니다.

  • 메시지 리스너 컨테이너(Message Listener Container): 대기열에 메시지를 보내고 처리하는 컴포넌트입니다. 메시지를 수신하고 필요한 처리를 위해 메시지 리스너(예: @JmsListener)를 구독하고 관리합니다.

    • 메시지 수신 및 전달, 스케줄링, 변환, 오류 처리
    • 비동기적 처리와 병렬화를 통한 메시지 처리 성능 향상
    • 메시지 브로커와 메시지 송수신 관리하는 런타임 환경
  • 템플릿(Template): 메시지를 생성하고 송수신하는 추상화된 인터페이스를 제공합니다. 메시지를 송수신할 때 사용하는 다양한 연산을 단순화하고 추상화시킵니다. 예를 들어, JMS의 JmsTemplate, RabbitMQ의 RabbitTemplate 등이 있습니다.

  • 커넥션 팩토리(Connection Factory): 메시지 브로커와의 연결을 설정하고 관리하는 데 사용됩니다. 연결을 생성하고 관리하여 통신을 가능하게 합니다.

    • 커넥션, 세션, 프로듀서, 컨슈머 등을 관리하고 재사용 할 수 있게 하는 인터페잇 제공

3. Redis, RabbitMQ, JMS

  • 공통점:

    • 모두 메시지 기반 통신을 지원하여 분산 시스템 간의 통신을 용이하게 합니다.
    • 메시지 큐를 통해 메시지를 비동기적으로 송수신할 수 있어 시스템 간 결합도를 낮출 수 있습니다.
    • 안정성과 확장성을 제공하여 대량의 데이터 및 요청을 처리할 수 있습니다.
  • 차이점:

    • Redis: 메모리 기반의 데이터 구조 저장소로, 빠른 속도와 성능을 제공합니다. 주로 캐싱, 세션 관리, 게임 리더보드 등에 사용됩니다.
    • RabbitMQ: AMQP(Advanced Message Queuing Protocol)를 기반으로 하는 오픈 소스 메시지 브로커로, 대기열을 통해 메시지를 처리합니다. 유연한 라우팅 및 교환 기능을 제공합니다.
    • JMS(Java Message Service): 자바 플랫폼용 메시지 기반 미들웨어 표준으로, 여러 메시지 브로커를 사용할 수 있습니다. JMS API는 다양한 메시지 형식 및 전송 프로토콜을 지원합니다. JMS는 다른 메시지 브로커들과 호환성을 유지하며, Spring에서도 JMS를 쉽게 사용할 수 있도록 지원합니다.

4. Redis, RabbitMQ, JMS의 메시징 방식이 프로그래밍적 요소에 미치는 영향:

  • Redis: Pub/Sub 모델을 사용하며, 메시지를 채널을 통해 발행하고 구독합니다. 이는 Queue와 Topic과는 조금 다른 패러다임이며, 메시지 브로커나 컨테이너 등의 추상화 요소가 적습니다.

  • RabbitMQ: Exchange를 사용하여 메시지 라우팅을 관리하며, Direct, Fanout, Topic 등 다양한 Exchange 타입을 지원합니다. 이에 맞춰 컨테이너, 템플릿, 리스너 등의 프로그래밍적 요소가 Exchange에 따라 다르게 설정됩니다.

  • JMS: Queue는 P2P 메시징, Topic은 Publish/Subscribe 모델을 지원하여 프로그래머가 필요에 따라 이러한 패턴을 적용할 수 있습니다. JMS의 컨테이너, 커넥션 팩토리, 템플릿, 리스너 등은 이러한 다양한 메시징 모델을 지원하도록 구성됩니다.

What You Will Build

Spring의 JmsTemplate을 사용하여 단일 메시지를 게시하고 관리되는 Bean의 @JmsListener 주석 메서드를 사용하여 이를 구독하는 애플리케이션을 빌드합니다.

Starting with Spring Initializr

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.0'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'guides'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-artemis'
	implementation 'org.springframework.boot:spring-boot-starter-json'
	runtimeOnly 'org.apache.activemq:artemis-jakarta-server'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

Create a message Receiver

Spring은 POJO(Plain Old Java Object)에 메시지를 게시(publish)하는 수단을 제공합니다.

이 가이드에서는 JMS 메시지 브로커를 통해 메시지를 보내는 방법을 설명합니다. 시작하려면 이메일 메시지의 세부정보를 구현하는(embodies) 간단한 POJO를 만듭니다. 우리는 이메일 메시지를 보내는 것이 아닙니다. 우리는 메시지로 보낼 내용(WHAT to send)에 대한 세부 정보를 한 곳에서 다른 곳으로 보냅니다.

src/main/java/hello/Email.java

package hello;


public class Email {

  private String to;
  private String body;

  public Email() {
  }

  public Email(String to, String body) {
    this.to = to;
    this.body = body;
  }

  public String getTo() {
    return to;
  }

  public void setTo(String to) {
    this.to = to;
  }

  public String getBody() {
    return body;
  }

  public void setBody(String body) {
    this.body = body;
  }

  @Override
  public String toString() {
    return String.format("Email{to=%s, body=%s}", getTo(), getBody());
  }

}

이 POJO는 추정된 getter 및 setter 세트와 함께 두 개의 필드(tobody)를 포함하는 매우 간단합니다.

여기에서 메시지 수신자(Receiver)를 정의할 수 있습니다.

src/main/java/hello/Receiver.java

package hello;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {
    
    @JmsListener(destination = "mailbox", containerFactory = "myFactory")
    public void receiveMessage(Email email) {
        System.out.println("Received <"+email+">");
    }
}

Receiver메시지 기반 POJO(message-driven POJO) 라고도 합니다. 코드에서 볼 수 있듯이 특정 인터페이스를 구현하거나 메서드가 특정 이름을 가질 필요가 없습니다. 게다가, 이 메소드는 유연한 시그니처를 가질 수도 있습니다. 특히 이 클래스에는 JMS API를 가져오지 않는다는 점에 유의하세요.

JmsListener 주석은 이 메소드가 수신(listen)해야 하는 Destination의 이름과 기본 메시지 수신기(listener) 컨테이너를 생성하는 데 사용할 JmsListenerContainerFactory에 대한 참조를 정의합니다. 엄밀히 말하면 Spring Boot는 필요한 경우 기본 팩토리를 등록하므로 컨테이너 빌드 방식을 사용자 정의해야 하는 경우가 아니면 마지막 속성은 필요하지 않습니다.

참조 문서에서 이에 대해 더 자세히 다루고 있습니다.

Spring을 사용하여 JMS 메시지 보내기 및 받기

다음으로 송신자(sender)와 수신자(receiver)를 연결합니다.

src/main/java/hello/Application.java

package hello;


import jakarta.jms.ConnectionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;

@SpringBootApplication
@EnableJms
public class Application {

    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // 메시지 변환기를 포함한 모든 자동 구성 기본값들을 이 팩토리에 제공합니다.
        configurer.configure(factory, connectionFactory);
        // 필요하다면 설정을 더 override 할 수 있습니다.
        return  factory;
    }

    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }

    public static void main(String[] args) {
        // Launch the application
        ConfigurableApplicationContext context =
                SpringApplication.run(Application.class, args);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

        // Send a message with a POJO - the template reuse the message converter
        System.out.println("Sending an email message");
        jmsTemplate.convertAndSend("mailbox", new Email("info@example.com", "Hello"));

    }

}
  • MessageConverter: JMS 메시지를 변환하는 데 사용되며, 메시지의 Payload를 직렬화하고 역직렬화합니다.

    • 페이로드는 메시지가 전송하는 데이터 자체를 의미하며, 메시지 시스템에 따라 선택적으로 사용될 수 있습니다.
    • 일부 메시지 시스템에서는 메시지 페이로드를 명시적으로 다루기 위해 특정한 형식으로 메시지를 구성하거나, MessageConverter와 같은 도구를 사용하여 메시지의 내용을 변환하고 처리합니다. 이러한 변환기는 메시지의 페이로드를 시스템이 처리 가능한 형태로 변경하는 데 사용될 수 있습니다.
  • MappingJackson2MessageConverter: JSON 형식의 메시지를 JMS 메시지로 변환하고 역변환하는 데 사용됩니다.

  • ConfigurableApplicationContextApplicationContext를 확장한 인터페이스입니다.

    • ApplicationContext는 애플리케이션 컨텍스트의 빈들을 로드하고 관리하는 역할을 수행합니다.
    • ConfigurableApplicationContext는 이러한 빈 관리 능력에 추가로 애플리케이션의 라이프사이클을 제어하고, 환경 설정을 동적으로 변경할 수 있는 기능을 갖추고 있습니다.
  • JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

    • context.getBean(JmsTemplate.class)이 호출되면 스프링 컨텍스트가 JmsTemplate 타입의 빈을 찾아 반환합니다.
    • 스프링은 아래 두 Bean을 자동으로 검색하여 JmsTemplate에 의존성 주입(Dependency Injection)합니다.
      • myFactory 메서드에서 : DefaultJmsListenerContainerFactory 빈 (JMS Listener를 생성)
      • jacksonJmsMessageConverter 메서드에서 : appingJackson2MessageConverter 빈 (JSON 형식의 메시지를 JMS 메시지로 변환)
  • jmsTemplate.convertAndSend("mailbox", new Email("info@example.com", "Hello")); : JmsTemplate은 내부적으로 MappingJackson2MessageConverter를 사용하여 POJO 객체인 Email을 JMS 메시지로 변환한 후, mailbox라는 대상(destination)에 메시지를 전송합니다.


명확성을 위해 수신기의 JmsListener 주석에서 참조되는 myFactory Bean도 정의했습니다. Spring Boot에서 제공하는 DefaultJmsListenerContainerFactoryConfigurer 인프라를 사용하기 때문에 JmsMessageListenerContainer는 Spring Boot가 기본적으로 생성하는 것과 동일합니다.

기본 MessageConverter는 기본 유형(예: String, Map, Serializable)만 변환할 수 있으며 Email은 의도적으로 Serializable 하지 않습니다. 우리는 Jackson을 사용하여 콘텐츠를 텍스트 형식(즉, TextMessage)으로 JSON으로 직렬화하려고 합니다. Spring Boot는 MessageConverter의 존재를 감지하고 이를 기본 JmsTemplateDefaultJmsListenerContainerFactoryConfigurer에 의해 생성된 JmsListenerContainerFactory에 연결합니다. JSON 변환기에는 spring-boot-starter-json 종속성이 필요합니다.

JmsTemplate을 사용하면 JMS 대상(destination)으로 메시지를 보내는 것이 간단해집니다. main 러너(runner) 메소드에서는 작업을 시작한 후 jmsTemplate을 사용하여 Email POJO를 보낼 수 있습니다. 사용자 정의 MessageConverter가 자동으로 연결되었기 때문에 JSON 문서는 TextMessage에서만 생성됩니다.

정의되지 않은 두 개의 Bean은 JmsTemplateConnectionFactory입니다. 이는 Spring Boot에 의해 자동으로 생성됩니다. 또한 Spring Boot는 JMS 인프라를 사용할 수 있을 때 @JmsListener 주석이 달린 메서드를 자동으로 검색합니다. 즉, @EnableJms를 추가할 필요가 없습니다.

기본적으로 Spring Boot는 로컬 시스템에서 실행되는 artemis 브로커에 연결을 시도합니다. 다음 구성 속성을 추가하여 브로커를 포함할 수도 있습니다.

spring.artemis.mode=embedded

또한 org.apache.activemq:artemis-jakarta-server에 대한 종속성을 추가해야 합니다.

기본적으로 Spring Boot는 pubSubDomainfalse로 설정하여 대기열(queue)로 전송하도록 구성된 JmsTemplate을 생성합니다. JmsMessageListenerContainer도 동일한 방식으로 구성됩니다. 재정의하려면 Spring Boot의 속성 설정(application.properties 내부 또는 환경 변수 설정)을 통해 spring.jms.pub-sub-domain=true를 설정하세요. 그런 다음 수신(receiving) 컨테이너의 설정이 동일한지 확인하세요.

Spring의 JmsTemplatereceive 메소드를 통해 직접 메시지를 수신할 수 있지만 이는 동기적으로만 작동하며, 이는 곧 'block'을 의미합니다. 그렇기 때문에 캐시 기반 연결 팩토리와 함께 DefaultMessageListenerContainer와 같은 리스너 컨테이너를 사용하는 것이 좋습니다. 그러면 메시지를 비동기적으로 최대 연결 효율성으로 사용할 수 있습니다.

실행 결과

2023-12-16T00:32:25.991+09:00  INFO 480774 --- [           main] hello.Application                        : Starting Application using Java 17.0.9 with PID 480774 (/home/Dev-Hammy/IdeaProjects/messaging-jms/build/classes/java/main started by Dev-Hammy in /home/Dev-Hammy/IdeaProjects/messaging-jms)
2023-12-16T00:32:25.996+09:00  INFO 480774 --- [           main] hello.Application                        : No active profile set, falling back to 1 default profile: "default"
2023-12-16T00:32:27.059+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221000: live Message Broker is starting with configuration Broker Configuration (clustered=false,journalDirectory=/tmp/artemis-data/journal,bindingsDirectory=data/bindings,largeMessagesDirectory=data/largemessages,pagingDirectory=data/paging)
2023-12-16T00:32:27.079+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221045: libaio is not available, switching the configuration into NIO
2023-12-16T00:32:27.137+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221057: Global Max Size is being adjusted to 1/2 of the JVM max size (-Xmx). being defined as 1028653056
2023-12-16T00:32:27.177+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221043: Protocol module found: [artemis-server]. Adding protocol support for: CORE
2023-12-16T00:32:27.217+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601138: User anonymous@unknown is getting notification info on target resource: null
2023-12-16T00:32:27.218+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl@2dd8239
2023-12-16T00:32:27.218+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601138: User anonymous@unknown is getting notification info on target resource: ActiveMQServerImpl::name=localhost
2023-12-16T00:32:27.232+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ224092: Despite disabled persistence, page files will be persisted.
2023-12-16T00:32:27.244+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221080: Deploying address DLQ supporting [ANYCAST]
2023-12-16T00:32:27.247+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.AddressControlImpl@71ad3d8a
2023-12-16T00:32:27.250+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221003: Deploying ANYCAST queue DLQ on address DLQ
2023-12-16T00:32:27.375+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.QueueControlImpl@6eb17ec8
2023-12-16T00:32:27.377+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221080: Deploying address ExpiryQueue supporting [ANYCAST]
2023-12-16T00:32:27.378+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.AddressControlImpl@730f9695
2023-12-16T00:32:27.378+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221003: Deploying ANYCAST queue ExpiryQueue on address ExpiryQueue
2023-12-16T00:32:27.379+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.QueueControlImpl@277bf091
2023-12-16T00:32:27.382+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.AddressControlImpl@3374b5bc
2023-12-16T00:32:27.423+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.base           : AMQ601019: User anonymous@unknown is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.AcceptorControlImpl@1687eb01
2023-12-16T00:32:27.431+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221007: Server is now live
2023-12-16T00:32:27.431+09:00  INFO 480774 --- [           main] o.apache.activemq.artemis.core.server    : AMQ221001: Apache ActiveMQ Artemis Message Broker version 2.31.2 [localhost, nodeID=26d18dee-9b5f-11ee-bab0-00e04c361b49] 
2023-12-16T00:32:27.718+09:00  INFO 480774 --- [           main] org.apache.activemq.audit.resource       : AMQ601767: CORE connection 2734bc93-9b5f-11ee-bab0-00e04c361b49 for user unknown@invm:0 created
2023-12-16T00:32:27.798+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601267: User anonymous@invm:0 is creating a core session on target resource ActiveMQServerImpl::name=localhost with parameters: [27422a16-9b5f-11ee-bab0-00e04c361b49, null, ****, 102400, RemotingConnectionImpl [ID=2734bc93-9b5f-11ee-bab0-00e04c361b49, clientID=null, nodeID=26d18dee-9b5f-11ee-bab0-00e04c361b49, transportConnection=InVMConnection [serverID=0, id=2734bc93-9b5f-11ee-bab0-00e04c361b49]], false, false, false, false, null, org.apache.activemq.artemis.core.protocol.core.impl.CoreSessionCallback@5fe78d8e, true, {}]
2023-12-16T00:32:27.852+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601267: User anonymous@invm:0 is creating a core session on target resource ActiveMQServerImpl::name=localhost with parameters: [274adca7-9b5f-11ee-bab0-00e04c361b49, null, ****, 102400, RemotingConnectionImpl [ID=2734bc93-9b5f-11ee-bab0-00e04c361b49, clientID=null, nodeID=26d18dee-9b5f-11ee-bab0-00e04c361b49, transportConnection=InVMConnection [serverID=0, id=2734bc93-9b5f-11ee-bab0-00e04c361b49]], false, false, false, false, null, org.apache.activemq.artemis.core.protocol.core.impl.CoreSessionCallback@1553d276, true, {}]
2023-12-16T00:32:27.861+09:00  INFO 480774 --- [           main] hello.Application                        : Started Application in 2.306 seconds (process running for 3.006)
Sending an email message
2023-12-16T00:32:27.868+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601267: User anonymous@invm:0 is creating a core session on target resource ActiveMQServerImpl::name=localhost with parameters: [274de9e8-9b5f-11ee-bab0-00e04c361b49, null, ****, 102400, RemotingConnectionImpl [ID=2734bc93-9b5f-11ee-bab0-00e04c361b49, clientID=null, nodeID=26d18dee-9b5f-11ee-bab0-00e04c361b49, transportConnection=InVMConnection [serverID=0, id=2734bc93-9b5f-11ee-bab0-00e04c361b49]], true, true, false, false, null, org.apache.activemq.artemis.core.protocol.core.impl.CoreSessionCallback@378dd896, true, {}]
2023-12-16T00:32:27.881+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601262: User anonymous@invm:0 is creating address on target resource: 274de9e8-9b5f-11ee-bab0-00e04c361b49 with parameters: [mailbox, [ANYCAST], true]
2023-12-16T00:32:27.884+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601019: User anonymous@invm:0 is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.AddressControlImpl@682c966e
2023-12-16T00:32:27.908+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.resource       : AMQ601065: User anonymous@invm:0 is creating a queue on target resource: ServerSessionImpl() with parameters: [QueueConfiguration [id=null, name=mailbox, address=mailbox, routingType=ANYCAST, filterString=null, durable=true, user=null, maxConsumers=-1, exclusive=null, groupRebalance=null, groupRebalancePauseDispatch=null, groupBuckets=null, groupFirstKey=null, lastValue=null, lastValueKey=null, nonDestructive=null, purgeOnNoConsumers=false, enabled=null, consumersBeforeDispatch=null, delayBeforeDispatch=null, consumerPriority=null, autoDelete=null, autoDeleteDelay=null, autoDeleteMessageCount=null, ringSize=null, configurationManaged=null, temporary=false, autoCreateAddress=null, internal=null, transient=null, autoCreated=true, fqqn=null]]
2023-12-16T00:32:27.909+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.resource       : AMQ601065: User anonymous@invm:0 is creating a queue on target resource: ServerSessionImpl() with parameters: [QueueConfiguration [id=null, name=mailbox, address=mailbox, routingType=ANYCAST, filterString=null, durable=true, user=null, maxConsumers=-1, exclusive=null, groupRebalance=null, groupRebalancePauseDispatch=null, groupBuckets=null, groupFirstKey=null, lastValue=null, lastValueKey=null, nonDestructive=null, purgeOnNoConsumers=false, enabled=null, consumersBeforeDispatch=null, delayBeforeDispatch=null, consumerPriority=null, autoDelete=null, autoDeleteDelay=null, autoDeleteMessageCount=null, ringSize=null, configurationManaged=null, temporary=false, autoCreateAddress=null, internal=null, transient=null, autoCreated=true, fqqn=null]]
2023-12-16T00:32:27.910+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601019: User anonymous@invm:0 is getting mbean info on target resource: org.apache.activemq.artemis.core.management.impl.QueueControlImpl@75d57014
2023-12-16T00:32:27.913+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.base           : AMQ601265: User anonymous@invm:0 is creating a core consumer on target resource ServerSessionImpl() with parameters: [0, mailbox, null, 0, false, true, null]
2023-12-16T00:32:28.019+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.message        : AMQ601501: User anonymous@invm:0 is consuming a message from mailbox: Reference[19]:RELIABLE:CoreMessage[messageID=19, durable=true, userID=2760d5ab-9b5f-11ee-bab0-00e04c361b49, priority=4, timestamp=Sat Dec 16 00:32:27 KST 2023, expiration=0, durable=true, address=mailbox, size=337, properties=TypedProperties[__AMQ_CID=27422a15-9b5f-11ee-bab0-00e04c361b49, _type=hello.Email, _AMQ_ROUTING_TYPE=1]]@207280815
2023-12-16T00:32:28.018+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.message        : AMQ601500: User anonymous@invm:0 sent a message CoreMessage[messageID=19, durable=true, userID=2760d5ab-9b5f-11ee-bab0-00e04c361b49, priority=4, timestamp=Sat Dec 16 00:32:27 KST 2023, expiration=0, durable=true, address=mailbox, size=337, properties=TypedProperties[__AMQ_CID=27422a15-9b5f-11ee-bab0-00e04c361b49, _type=hello.Email, _AMQ_ROUTING_TYPE=1]]@207280815, context: RoutingContextImpl(Address=mailbox, routingType=ANYCAST, PreviousAddress=mailbox previousRoute:ANYCAST, reusable=true, version=-2147483645)
..................................................
***** durable queues mailbox:
- queueID=14 address:mailbox name:mailbox filter:null
***** non durable for mailbox:
..................................................
, transaction: null
Received <Email{to=info@example.com, body=Hello}>
2023-12-16T00:32:28.079+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.message        : AMQ601759: User anonymous@invm:0 added acknowledgement of a message from mailbox: CoreMessage[messageID=19, durable=true, userID=2760d5ab-9b5f-11ee-bab0-00e04c361b49, priority=4, timestamp=Sat Dec 16 00:32:27 KST 2023, expiration=0, durable=true, address=mailbox, size=337, properties=TypedProperties[__AMQ_CID=27422a15-9b5f-11ee-bab0-00e04c361b49, _type=hello.Email, _AMQ_ROUTING_TYPE=1]]@207280815 to transaction: TransactionImpl [xid=null, txID=9, xid=null, state=ACTIVE, createTime=1702654347852(Sat Dec 16 00:32:27 KST 2023), timeoutSeconds=300, nr operations = 1]@662460a6
2023-12-16T00:32:28.081+09:00  INFO 480774 --- [mpl$6@62566842)] org.apache.activemq.audit.message        : AMQ601502: User anonymous@invm:0 acknowledged message from mailbox: CoreMessage[messageID=19, durable=true, userID=2760d5ab-9b5f-11ee-bab0-00e04c361b49, priority=4, timestamp=Sat Dec 16 00:32:27 KST 2023, expiration=0, durable=true, address=mailbox, size=337, properties=TypedProperties[__AMQ_CID=27422a15-9b5f-11ee-bab0-00e04c361b49, _type=hello.Email, _AMQ_ROUTING_TYPE=1]]@207280815, transaction: TransactionImpl [xid=null, txID=9, xid=null, state=COMMITTED, createTime=1702654347852(Sat Dec 16 00:32:27 KST 2023), timeoutSeconds=300, nr operations = 0]@662460a6

이 로그들은 어플리케이션이 시작되고 ActiveMQ Artemis 메시지 브로커가 설정되고 동작하는 과정을 나타냅니다.

  1. 시작 및 설정 정보:

    • hello.Application이라는 애플리케이션이 Java 17.0.9 버전으로 시작됨.
    • 어떤 프로필도 설정되지 않았으므로 "default" 프로필을 사용하고 있음.
    • ActiveMQ Artemis 메시지 브로커가 설정되고 live 상태로 시작됨.
  2. ActiveMQ Artemis 설정 정보:

    • libaio가 사용 불가능하여 NIO로 설정 전환됨.
    • 메모리 설정(Global Max Size)이 JVM 최대 메모리 크기의 절반으로 조정됨.
    • Protocol module artemis-server가 발견되어 CORE 프로토콜 지원 추가됨.
    • persistence가 비활성화되어 있음에도 불구하고 페이지 파일이 지속됨.
  3. 주요 설정 및 큐 배포:

    • Dead Letter Queue(DLQ)와 ExpiryQueue가 배포됨.
    • 각각의 큐에 대한 설정과 정보를 가져오는 것이 로그되어 있음.
  4. 서버 동작 및 메시지 전송:

    • 서버가 라이브 상태로 설정되고 메시지 브로커 버전이 로깅됨.
    • 메시지가 전송되고 송수신과 관련된 정보들이 로깅됨.
Sending an email message
Received <Email{to=info@example.com, body=Hello}>

이메일 전송에 관련된 내용

0개의 댓글