AMQ Core Protocol JMS 클라이언트 사용

Red Hat AMQ Clients 2.11

AMQ Clients 2.11과 함께 사용하는 경우

초록

이 가이드에서는 클라이언트를 설치 및 구성하고, 실습 예제를 실행하고, 다른 AMQ 구성 요소와 함께 클라이언트를 사용하는 방법을 설명합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. 개요

AMQ Core Protocol JMS는 Artemis Core Protocol 메시지를 전송 및 수신하는 메시징 애플리케이션에서 사용할 수 있는 JMS(Java Message Service) 2.0 클라이언트입니다.

AMQ Core Protocol JMS는 여러 언어와 플랫폼을 지원하는 메시징 라이브러리 제품군인 AMQ Client의 일부입니다. 클라이언트 개요는 AMQ 클라이언트 개요 를 참조하십시오. 이 릴리스에 대한 자세한 내용은 AMQ Clients 2.11 릴리스 정보를 참조하십시오.

AMQ Core Protocol JMS는 Apache ActiveMQ Artemis 의 JMS 구현을 기반으로 합니다. JMS API에 대한 자세한 내용은 JMS API 참조JMS 튜토리얼을 참조하십시오.

1.1. 주요 기능

  • JMS 1.1 및 2.0 호환 가능
  • 보안 통신을 위한 SSL/TLS
  • 자동 다시 연결 및 장애 조치
  • distributed transactions (XA)
  • Pure-Java 구현

1.2. 지원되는 표준 및 프로토콜

AMQ Core Protocol JMS는 다음과 같은 업계 인식 표준 및 네트워크 프로토콜을 지원합니다.

1.3. 지원되는 구성

AMQ Core Protocol JMS 지원 구성에 대한 최신 정보는 Red Hat Customer Portal의 Red Hat AMQ 지원 구성을 참조하십시오.

1.4. 이용 약관

이 섹션에서는 핵심 API 엔티티를 소개하고 이러한 엔티티가 함께 작동하는 방법을 설명합니다.

표 1.1. API 용어

엔터티설명

ConnectionFactory

연결을 생성하기 위한 진입점입니다.

연결

네트워크의 두 피어 간 통신을 위한 채널입니다. 여기에는 세션이 포함되어 있습니다.

세션

메시지 생성 및 사용을 위한 컨텍스트입니다. 메시지 생산자와 소비자가 포함됩니다.

MessageProducer

메시지를 대상에 보내는 채널입니다. 대상 대상이 있습니다.

MessageConsumer

대상에서 메시지를 수신하기 위한 채널입니다. 소스 대상이 있습니다.

대상

큐 또는 주제 중 하나의 메시지에 대해 이름이 지정된 위치입니다.

저장된 메시지 시퀀스입니다.

주제

멀티 캐스트 배포를 위한 저장된 메시지 시퀀스입니다.

메시지

애플리케이션별 정보.

AMQ Core Protocol JMS는 메시지를 전송하고 수신합니다. 메시지는 메시지 생산자와 소비자를 사용하여 연결된 피어 간에 전송됩니다. 생산자와 소비자는 세션을 통해 설정됩니다. 세션은 연결을 통해 설정됩니다. 연결은 연결 팩토리에 의해 생성됩니다.

전송 피어는 메시지를 보내는 생산자를 생성합니다. 생산자에는 원격 피어에서 대상 큐 또는 주제를 식별하는 대상이 있습니다. 수신 피어는 메시지를 수신할 소비자를 생성합니다. 생산자와 마찬가지로 소비자에는 원격 피어에서 소스 대기열 또는 주제를 식별하는 대상이 있습니다.

대상은 대기열 또는 주제입니다. JMS에서 큐 및 항목은 메시지를 보유하는 이름 지정된 브로커 엔티티의 클라이언트 측 표현입니다.

큐는 지점 간 의미 체계를 구현합니다. 각 메시지는 하나의 소비자가 볼 수 있으며 메시지는 읽기 후 큐에서 제거됩니다. 주제에서는 게시-서브스크립션 의미 체계를 구현합니다. 각 메시지는 여러 소비자가 볼 수 있으며, 메시지는 읽기 후에 다른 소비자가 사용할 수 있습니다.

자세한 내용은 JMS 튜토리얼을 참조하십시오.

1.5. 문서 규칙

sudo 명령

이 문서에서는 root 권한이 필요한 모든 명령에 sudo 를 사용합니다. sudo 를 사용할 때는 모든 변경 사항이 전체 시스템에 영향을 미칠 수 있으므로 주의하십시오. sudo 에 대한 자세한 내용은 sudo 명령 사용을 참조하십시오.

파일 경로

이 문서에서 모든 파일 경로는 Linux, UNIX 및 유사한 운영 체제(예: /home/andrea)에 유효합니다. Microsoft Windows에서는 동등한 Windows 경로(예: C:\Users\andrea)를 사용해야 합니다.

변수 텍스트

이 문서에는 해당 환경과 관련된 값으로 교체해야 하는 변수로 코드 블록이 포함되어 있습니다. 변수 텍스트는 화살표 중괄호로 묶고 italic monospace로 스타일링됩니다. 예를 들어 다음 명령에서 < project-dir> 을 사용자 환경의 값으로 바꿉니다.

$ cd <project-dir>

2장. 설치

이 장에서는 환경에 AMQ Core Protocol JMS를 설치하는 단계를 안내합니다.

2.1. 사전 요구 사항

  • AMQ 릴리스 파일 및 리포지토리에 액세스할 수 있는 서브스크립션 이 있어야 합니다.
  • AMQ Core Protocol JMS를 사용하여 프로그램을 빌드하려면 Apache Maven 을 설치해야 합니다.
  • AMQ Core Protocol JMS를 사용하려면 Java를 설치해야 합니다.

2.2. Red Hat Maven 리포지토리 사용

Red Hat Maven 리포지토리에서 클라이언트 라이브러리를 다운로드하도록 Maven 환경을 구성합니다.

절차

  1. Maven 설정 또는 POM 파일에 Red Hat 리포지토리를 추가합니다. 예를 들어 설정 파일은 B.1절. “온라인 리포지토리 사용” 에서 참조하십시오.

    <repository>
      <id>red-hat-ga</id>
      <url>https://maven.repository.redhat.com/ga</url>
    </repository>
  2. POM 파일에 라이브러리 종속성을 추가합니다.

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>artemis-jms-client</artifactId>
      <version>2.18.0.redhat-00021</version>
    </dependency>

이제 Maven 프로젝트에서 클라이언트를 사용할 수 있습니다.

2.3. 로컬 Maven 리포지토리 설치

온라인 리포지토리 대신 AMQ Core Protocol JMS를 파일 기반 Maven 리포지토리로 로컬 파일 시스템에 설치할 수 있습니다.

절차

  1. 서브스크립션을 사용하여 AMQ Broker 7.9.0 Maven 리포지토리 .zip 파일을 다운로드합니다.
  2. 선택한 디렉터리로 파일 내용을 추출합니다.

    Linux 또는 UNIX에서 unzip 명령을 사용하여 파일 내용을 추출합니다.

    $ unzip amq-broker-7.9.0-maven-repository.zip

    Windows에서 .zip 파일을 마우스 오른쪽 버튼으로 클릭하고 압축 풀기 를 선택합니다.

  3. 추출된 설치 디렉터리 내의 maven-repository 디렉터리에 있는 리포지토리를 사용하도록 Maven을 구성합니다. 자세한 내용은 B.2절. “로컬 리포지터리 사용”의 내용을 참조하십시오.

2.4. 예제 설치

절차

  1. 서브스크립션을 사용하여 AMQ Broker 7.9.0 .zip 파일을 다운로드합니다.
  2. 선택한 디렉터리로 파일 내용을 추출합니다.

    Linux 또는 UNIX에서 unzip 명령을 사용하여 파일 내용을 추출합니다.

    $ unzip amq-broker-7.9.0.zip

    Windows에서 .zip 파일을 마우스 오른쪽 버튼으로 클릭하고 압축 풀기 를 선택합니다.

    .zip 파일의 내용을 추출하면 amq-broker-7.9.0 이라는 디렉터리가 생성됩니다. 이는 설치의 최상위 디렉토리이며 이 문서 전체에서 < install-dir> 이라고 합니다.

3장. 시작하기

이 장에서는 환경을 설정하고 간단한 메시징 프로그램을 실행하는 단계를 안내합니다.

3.1. 사전 요구 사항

3.2. 첫 번째 예제 실행

이 예제에서는 exampleQueue 라는 큐에 대한 소비자 및 생산자를 생성합니다. 텍스트 메시지를 전송한 다음 이를 다시 수신하여 수신된 메시지를 콘솔에 인쇄합니다.

절차

  1. Maven을 사용하여 < install-dir> /examples/features/standard/queue 디렉터리에서 다음 명령을 실행하여 예제를 빌드합니다.

    $ mvn clean package dependency:copy-dependencies -DincludeScope=runtime -DskipTests

    dependency:copy-dependencies 를 추가하면 종속 항목이 target/dependency 디렉터리에 복사됩니다.

  2. java 명령을 사용하여 예제를 실행합니다.

    Linux 또는 UNIX에서:

    $ java -cp "target/classes:target/dependency/*" org.apache.activemq.artemis.jms.example.QueueExample

    Windows에서 다음을 수행합니다.

    > java -cp "target\classes;target\dependency\*" org.apache.activemq.artemis.jms.example.QueueExample

예를 들어 Linux에서 실행하면 다음과 같은 출력이 생성됩니다.

$ java -cp "target/classes:target/dependency/*" org.apache.activemq.artemis.jms.example.QueueExample
Sent message: This is a text message
Received message: This is a text message

예제의 소스 코드는 < install-dir> /examples/features/standard/queue/src 디렉터리에 있습니다. 추가 예제는 < install-dir> /examples/features/standard 디렉토리에서 사용할 수 있습니다.

4장. 설정

이 장에서는 AMQ Core Protocol JMS 구현을 JMS 애플리케이션에 바인딩하고 구성 옵션을 설정하는 프로세스를 설명합니다.

JMS는 JVM(Java Naming Directory Interface)을 사용하여 API 구현 및 기타 리소스를 등록하고 조회합니다. 이를 통해 특정 구현에 연결하지 않고 JMS API에 코드를 작성할 수 있습니다.

구성 옵션은 연결 URI에서 쿼리 매개변수로 노출됩니다.

4.1. JNDI 초기 컨텍스트 구성

JMS 애플리케이션은 InitialContext Factory 에서 얻은 JNDI InitialContext 오브젝트를 사용하여 연결 팩토리와 같은 JMS 개체를 찾습니다. AMQ Core Protocol JMS는 org.apache.activemq.artemis.jndi.ActiveMQ InitialContextFactory 클래스에서 InitialContextFactory 구현을 제공합니다.

InitialContextFactory 구현은 InitialContext 오브젝트가 인스턴스화될 때 검색됩니다.

javax.naming.Context context = new javax.naming.InitialContext();

구현을 찾으려면 사용자 환경에 JNDI를 구성해야 합니다. jndi.properties 파일 사용, 시스템 속성 사용 또는 초기 컨텍스트 API 사용의 세 가지 방법이 있습니다.

jndi.properties 파일 사용

jndi.properties 라는 파일을 생성하여 Java classpath에 배치합니다. 키 java.naming.factory.initial 로 속성을 추가합니다.

예: jndi.properties 파일을 사용하여 JNDI 초기 컨텍스트 팩토리 설정

java.naming.factory.initial = org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory

Maven 기반 프로젝트에서 jndi.properties 파일은 < project-dir> /src/main/resources 디렉터리에 배치됩니다.

시스템 속성 사용

java.naming.factory.initial 시스템 속성을 설정합니다.

예: 시스템 속성을 사용하여 JNDI 초기 컨텍스트 팩토리 설정

$ java -Djava.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory ...

초기 컨텍스트 API 사용

JNDI 초기 컨텍스트 API 를 사용하여 속성을 프로그래밍 방식으로 설정합니다.

예: JNDI 속성 설정

Hashtable<Object, Object> env = new Hashtable<>();

env.put("java.naming.factory.initial", "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory");

InitialContext context = new InitialContext(env);

동일한 API를 사용하여 연결 팩토리, 큐 및 항목에 대한 JNDI 속성을 설정할 수 있습니다.

4.2. 연결 팩토리 구성

JMS 연결 팩토리는 연결을 생성하기 위한 진입점입니다. 애플리케이션별 구성 설정을 인코딩하는 연결 URI를 사용합니다.

팩토리 이름 및 연결 URI를 설정하려면 아래 형식으로 속성을 생성합니다. 이 구성을 jndi.properties 파일에 저장하거나 해당 시스템 속성을 설정할 수 있습니다.

연결 팩토리에 대한 JNDI 속성 형식

connectionFactory.<lookup-name> = <connection-uri>

예를 들어 app1 이라는 팩토리를 구성하는 방법은 다음과 같습니다.

예: jndi.properties 파일에서 연결 팩토리 설정

connectionFactory.app1 = tcp://example.net:61616?clientID=backend

그러면 JNDI 컨텍스트를 사용하여 app1 이라는 이름으로 구성된 연결 팩토리를 조회할 수 있습니다.

ConnectionFactory factory = (ConnectionFactory) context.lookup("app1");

4.3. 연결 URI

연결은 연결 URI를 사용하여 구성됩니다. 연결 URI는 원격 호스트, 포트 및 쿼리 매개변수로 설정된 구성 옵션 집합을 지정합니다. 사용 가능한 옵션에 대한 자세한 내용은 5장. 구성 옵션 을 참조하십시오.

연결 URI 형식

tcp://<host>:<port>[?<option>=<value>[&<option>=<value>...]]

예를 들어 다음은 포트 61616 에서 호스트 example.net 에 연결하고 클라이언트 ID를 backend 로 설정하는 연결 URI입니다.

예: 연결 URI

tcp://example.net:61616?clientID=backend

tcp 외에도 AMQ Core Protocol JMS는 vm,udp, jgroups 체계도 지원합니다. 이는 대체 전송을 나타내며 브로커에 해당 어셉터 구성이 있습니다.

장애 조치 URI

URI에는 여러 대상 연결 URI가 포함될 수 있습니다. 하나의 대상에 대한 초기 연결이 실패하면 다른 대상을 시도합니다. 다음과 같은 형식을 취합니다.

장애 조치 URI 형식

(<connection-uri>[,<connection-uri>])[?<option>=<value>[&<option>=<value>...]]

세차 외부의 옵션은 모든 연결 URI에 적용됩니다.

4.4. 큐 및 주제 이름 구성

JMS는 JNDI를 사용하여 배포별 대기열 및 주제 리소스를 조회하는 옵션을 제공합니다.

JNDI에서 큐 및 주제 이름을 설정하려면 다음 형식으로 속성을 생성합니다. 이 구성을 jndi.properties 파일에 배치하거나 해당 시스템 속성을 설정합니다.

큐 및 항목에 대한 JNDI 속성 형식

queue.<lookup-name> = <queue-name>
topic.<lookup-name> = <topic-name>

예를 들어 다음 속성은 두 개의 배포별 리소스에 대한 이름 작업알림을 정의합니다.

예: jndi.properties 파일에서 큐 및 주제 이름 설정

queue.jobs = app1/work-items
topic.notifications = app1/updates

그러면 JNDI 이름으로 리소스를 조회할 수 있습니다.

Queue queue = (Queue) context.lookup("jobs");
Topic topic = (Topic) context.lookup("notifications");

5장. 구성 옵션

이 장에서는 AMQ Core Protocol JMS에 사용 가능한 구성 옵션을 나열합니다.

JMS 구성 옵션은 연결 URI에서 쿼리 매개 변수로 설정됩니다. 자세한 내용은 4.3절. “연결 URI”의 내용을 참조하십시오.

5.1. 일반 옵션

user
클라이언트가 연결을 인증하는 데 사용하는 사용자 이름입니다.
암호
클라이언트가 연결을 인증하는 데 사용하는 암호입니다.
clientID
클라이언트가 연결에 적용되는 클라이언트 ID입니다.
groupID
클라이언트가 생성된 모든 메시지에 적용되는 그룹 ID입니다.
autoGroup
활성화된 경우 임의의 그룹 ID를 생성하여 생성된 모든 메시지에 적용합니다.
preAcknowledge
활성화된 경우 보내는 즉시 메시지를 승인하고 전달이 완료되기 전에 승인합니다. 이는 "대부분 한 번"을 제공합니다. 이는 기본적으로 비활성화되어 있습니다.
blockOnDurableSend
활성화된 경우 변환되지 않은 지속성 메시지를 보낼 때 원격 피어가 수신을 승인할 때까지 차단합니다. 기본적으로 활성화되어 있습니다.
blockOnNonDurableSend
활성화된 경우 전송할 수 없는 메시지를 전송할 때 원격 피어가 수신될 때까지 차단합니다. 이는 기본적으로 비활성화되어 있습니다.
blockOnAcknowledge
활성화된 경우 전송되지 않은 메시지를 승인할 때 원격 피어가 승인 여부를 확인할 때까지 차단합니다. 이는 기본적으로 비활성화되어 있습니다.
callTimeout
차단 호출이 완료될 때까지 대기하는 시간(밀리초)입니다. 기본값은 30000(30초)입니다.
callFailoverTimeout
클라이언트가 장애 조치(failover) 프로세스인 경우 차단 호출을 시작하기 전에 millisconds의 시간이 대기합니다. 기본값은 30000(30초)입니다.
ackBatchSize
클라이언트가 브로커에 승인이 전송되기 전에 수신 및 승인할 수 있는 바이트 수입니다. 기본값은 1048576(1MiB)입니다.
dupsOKBatchSize
DUPS_OK_ACKNOWLEDGE 승인 모드를 사용하는 경우 승인 일괄 처리의 크기(바이트)입니다. 기본값은 1048576(1MiB)입니다.
transactionBatchSize
트랜잭션에서 혼란을 받을 때 승인 일괄 처리의 크기(바이트)입니다. 기본값은 1048576(1MiB)입니다.
cacheDestinations
활성화된 경우 캐시 대상 조회가 수행됩니다. 이는 기본적으로 비활성화되어 있습니다.

5.2. TCP 옵션

tcpNoDelay
활성화되어 있는 경우 지연하지 말고 버퍼 TCP가 보냅니다. 기본적으로 활성화되어 있습니다.
tcpSendBufferSize
전송 버퍼 크기(바이트)입니다. 기본값은 32768(32KiB)입니다.
tcpReceiveBufferSize
수신 버퍼 크기(바이트)입니다. 기본값은 32768(32KiB)입니다.
writeBufferLowWaterMark
쓰기 버퍼에 쓸 수 있게 되는 바이트 수의 제한입니다. 기본값은 32768(32KiB)입니다.
writeBufferHighWaterMark
쓰기 버퍼를 덮어쓸 수 없는 바이트 수입니다. 기본값은 131072(128KiB)입니다.

5.3. SSL/TLS 옵션

sslEnabled
활성화된 경우 SSL/TLS를 사용하여 연결을 인증하고 암호화합니다. 이는 기본적으로 비활성화되어 있습니다.
keyStorePath
SSL/TLS 키 저장소의 경로입니다. 상호 SSL/TLS 인증에 키 저장소가 필요합니다. 설정되지 않으면 javax.net.ssl.keyStore 시스템 속성 값이 사용됩니다.
keyStorePassword
SSL/TLS 키 저장소의 암호입니다. 설정되지 않으면 javax.net.ssl.keyStorePassword 시스템 속성 값이 사용됩니다.
trustStorePath
SSL/TLS 신뢰 저장소의 경로입니다. 설정되지 않으면 javax.net.ssl.trustStore 시스템 속성 값이 사용됩니다.
trustStorePassword
SSL/TLS 신뢰 저장소의 암호입니다. 설정되지 않으면 javax.net.ssl.trustStorePassword 시스템 속성 값이 사용됩니다.
trustAll
활성화된 경우 구성된 신뢰 저장소에 관계없이 제공된 서버 인증서를 암시적으로 신뢰합니다. 이는 기본적으로 비활성화되어 있습니다.
verifyHost
활성화하면 연결 호스트 이름이 제공된 서버 인증서와 일치하는지 확인합니다. 이는 기본적으로 비활성화되어 있습니다.
enabledCipherSuites
활성화할 암호화 제품군의 쉼표로 구분된 목록입니다. 설정되지 않으면 JVM 기본 암호가 사용됩니다.
enabledProtocols
활성화할 SSL/TLS 프로토콜의 쉼표로 구분된 목록입니다. 설정되지 않으면 JVM 기본 프로토콜이 사용됩니다.

5.4. 장애 조치 옵션

initialConnectAttempts
첫 번째 성공적인 연결 전과 클라이언트가 브로커 토폴로지를 검색하기 전에 허용된 재연결 시도 수입니다. 기본값은 0이므로 하나의 시도만 허용됩니다.
failoverOnInitialConnection
활성화된 경우 초기 연결에 실패하면 백업 서버에 연결을 시도합니다. 이는 기본적으로 비활성화되어 있습니다.
reconnnectAttempts
연결을 실패로 보고하기 전에 허용된 재연결 시도 수입니다. 기본값은 -1이며, 즉 제한이 없음을 의미합니다.
retryInterval
다시 연결 시도 사이의 시간(밀리초)입니다. 기본값은 2000초입니다.
retryIntervalMultiplier
재시도 간격을 늘리는 데 사용되는 multiplier입니다. 기본값은 1.0이며, 이는 동일한 간격을 의미합니다.
maxRetryInterval
재연결 시도 간 최대 시간(밀리초)입니다. 기본값은 2000초입니다.
ha
활성화된 경우 HA 브로커의 토폴로지 변경 사항을 추적합니다. URI의 호스트와 포트는 초기 연결에만 사용됩니다. 초기 연결 후 클라이언트는 현재 장애 조치 끝점과 토폴로지 변경으로 인한 업데이트를 받습니다. 이는 기본적으로 비활성화되어 있습니다.
connectionTTL
서버에서 ping 패킷을 보내지 않으면 연결이 실패한 시간(밀리초)입니다. 기본값은 60000(1분)입니다. -1은 시간 초과를 비활성화합니다.
confirmationWindowSize
명령 재생 버퍼의 크기(바이트)입니다. 재연결 시 자동 세션 재연결에 사용됩니다. 기본값은 -1이므로 자동 다시 연결하지 않습니다.
clientFailureCheckPeriod
시간(밀리초) 사이의 시간(밀리초)은 dead된 연결을 확인합니다. 기본값은 30000(30초)입니다. -1은 검사를 비활성화합니다.

5.5. 흐름 제어 옵션

자세한 내용은 8장. 흐름 제어의 내용을 참조하십시오.

consumerWindowSize
Per-consumer 메시지의 바이트 단위 크기입니다. 기본값은 1048576(1MiB)입니다. -1은 제한이 없음을 의미합니다. 0은 prefetching을 비활성화합니다.
consumerMaxRate
초당 사용할 최대 메시지 수입니다. 기본값은 -1이며, 즉 제한이 없음을 의미합니다.
producerWindowSize
더 많은 메시지를 생성하기 위해 필요한 단위 크기(바이트)입니다. 이는 한 번에 실행되는 전체 데이터 양을 제한합니다. 기본값은 1048576(1MiB)입니다. -1은 제한이 없음을 의미합니다.
producerMaxRate
초당 생성할 최대 메시지 수입니다. 기본값은 -1이며, 즉 제한이 없음을 의미합니다.

5.6. 로드 밸런싱 옵션

useTopologyForLoadBalancing
활성화된 경우 연결 로드 밸런싱에 클러스터 토폴로지를 사용합니다. 기본적으로 활성화되어 있습니다.
connectionLoadBalancingPolicyClassName
연결 로드 밸런싱 정책의 클래스 이름입니다. 기본값은 org.apache.activemq.artemis.api.core.client.loadbalance.RoundRobinConnectionLoadBalancingPolicy 입니다.

5.7. 대용량 메시지 옵션

클라이언트는 minLargeMessageSize 속성의 값을 설정하여 큰 메시지 지원을 활성화할 수 있습니다. minLargeMessageSize 보다 큰 메시지는 큰 메시지로 간주됩니다.

minLargeMessageSize
메시지가 큰 메시지로 처리되는 최소 바이트 크기입니다. 기본값은 102400(100KiB)입니다.
compressLargeMessages

활성화된 경우 minLargeMessageSize 에 정의된 대로 큰 메시지를 압축합니다. 이는 기본적으로 비활성화되어 있습니다. 큰 메시지의 압축 크기가 minLargeMessageSize 값보다 작으면 메시지가 일반 메시지로 전송되고 브로커의 large-message 데이터 디렉터리에 기록되지 않습니다. 메시지를 압축 및 압축 해제하는 프로세스는 클라이언트의 추가 CPU 사용량을 초래합니다.

참고

메시지 압축은 AMQ Core Protocol JMS 클라이언트에서만 지원됩니다.

5.8. 스레드 옵션

useGlobalPools
활성화된 경우 모든 ConnectionFactory 인스턴스에 대해 하나의 스레드 풀을 사용합니다. 그렇지 않으면 각 인스턴스에 대해 별도의 풀을 사용합니다. 기본적으로 활성화되어 있습니다.
threadPoolMaxSize
일반 스레드 풀의 최대 스레드 수입니다. 기본값은 -1이며, 즉 제한이 없음을 의미합니다.
scheduledThreadPoolMaxSize
예약된 작업에 대한 스레드 풀의 최대 스레드 수입니다. 기본값은 5입니다.

6장. 네트워크 연결

6.1. 자동 장애 조치

클라이언트는 모든 마스터 및 슬레이브 브로커에 대한 정보를 수신할 수 있으므로 연결 실패 시 슬레이브 브로커에 다시 연결할 수 있습니다. 그런 다음 슬레이브 브로커는 장애 조치 전에 각 연결에 존재하는 모든 세션과 소비자를 자동으로 다시 생성합니다. 이 기능을 사용하면 애플리케이션에서 수동 다시 연결 논리를 직접 코딩할 필요가 없습니다.

슬레이브에서 세션이 다시 생성되면 이미 전송되거나 승인된 메시지에 대한 지식이 없습니다. 장애 조치 시 진행 중인 모든 전송 또는 승인이 손실될 수 있습니다. 그러나 투명한 장애 조치(Failover)가 없어도 중복 탐지 및 트랜잭션 재시도의 조합을 사용하여 오류 발생 시에도 한 번만 제공하는 것을 한 번만 보장할 수 있습니다.

클라이언트는 구성 가능한 기간 내에 브로커에서 패킷을 수신하지 못한 경우 연결 오류를 탐지합니다. 자세한 내용은 6.3절. “손상된 연결 감지”를 참조하십시오.

마스터 및 슬레이브에 대한 정보를 수신하도록 클라이언트를 구성하는 여러 방법이 있습니다. 한 가지 옵션은 특정 브로커에 연결하도록 클라이언트를 구성한 다음 클러스터의 다른 브로커에 대한 정보를 수신하는 것입니다. 자세한 내용은 6.7절. “정적 검색 구성”를 참조하십시오. 그러나 가장 일반적인 방법은 브로커 검색을 사용하는 것입니다. 브로커 검색을 구성하는 방법에 대한 자세한 내용은 6.6절. “동적 검색 구성” 을 참조하십시오.

또한 아래 예제와 같이 브로커에 연결하는 데 사용되는 URI의 쿼리 문자열에 매개변수를 추가하여 클라이언트를 구성할 수 있습니다.

connectionFactory.ConnectionFactory=tcp://localhost:61616?ha=true&reconnectAttempts=3

절차

쿼리 문자열을 사용하여 장애 조치(failover)를 위해 클라이언트를 구성하려면 URI의 다음 구성 요소가 올바르게 설정되어 있는지 확인합니다.

  1. URI의 host:port 부분은 백업으로 올바르게 구성된 마스터 브로커를 가리켜야 합니다. 이 호스트 및 포트는 초기 연결에만 사용됩니다. host:port 값은 라이브 서버와 백업 서버 간의 실제 연결 장애 조치와 관련이 없습니다. 위의 예에서 localhost:61616host:port 에 사용됩니다.
  2. (선택 사항) 둘 이상의 브로커를 가능한 초기 연결로 사용하려면 다음 예와 같이 host:port 항목을 그룹화합니다.

    connectionFactory.ConnectionFactory=(tcp://host1:port,tcp://host2:port)?ha=true&reconnectAttempts=3
  3. 이름-값 쌍 ha=true 를 쿼리 문자열의 일부로 포함하여 클라이언트가 클러스터의 각 마스터 및 슬레이브 브로커에 대한 정보를 수신하도록 합니다.
  4. name-value pair reconnectAttempts=n. 여기서 n 은 0보다 큰 정수입니다. 이 매개변수는 클라이언트가 브로커에 다시 연결하려고 시도하는 횟수를 설정합니다.
참고

장애 조치(failover)는 ha=truereconnectAttempts 가 0보다 큰 경우에만 수행됩니다. 또한 다른 브로커에 대한 정보를 받으려면 마스터 브로커에 초기 연결을 수행해야 합니다. 초기 연결에 실패하면 클라이언트는 이를 설정하도록만 재시도할 수 있습니다. 자세한 내용은 6.1.1절. “초기 연결 중 오류 발생”를 참조하십시오.

6.1.1. 초기 연결 중 오류 발생

클라이언트는 HA 클러스터에 처음 연결될 때까지 모든 브로커에 대한 정보를 받지 않기 때문에 클라이언트가 연결 URI에 포함된 브로커에만 연결할 수 있는 시간 간격이 있습니다. 따라서 이 초기 연결 중에 오류가 발생하면 클라이언트는 다른 마스터 브로커로 장애 조치할 수 없지만 초기 연결만 다시 설정할 수 있습니다. 클라이언트는 일련의 재연결 시도에 대해 구성할 수 있습니다. 시도 횟수가 생성되면 예외가 발생합니다.

다시 연결 시도 수 설정

아래 예제에서는 AMQ Core Protocol JMS 클라이언트를 사용하여 재연결 시도 횟수를 3으로 설정하는 방법을 보여줍니다. 기본값은 0이며, 즉 한 번만 시도합니다.

절차

ServerLocator.setInitialConnectAttempts() 에 값을 전달하여 재연결 시도 횟수를 설정합니다.

ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
cf.setInitialConnectAttempts(3);
전역 수의 재연결 시도 설정

또는 브로커 구성 내의 최대 재연결 시도 횟수에 대해 글로벌 값을 적용할 수 있습니다. 최대값은 모든 클라이언트 연결에 적용됩니다.

절차

아래 예제와 같이 initial -connect-attempts 구성 요소를 추가하고 Time-to-live에 대한 값을 제공하여 <broker-instance-dir>/etc/broker.xml 을 편집합니다.

<configuration>
 <core>
  ...
  <initial-connect-attempts>3</initial-connect-attempts> 1
  ...
 </core>
</configuration>
1
브로커에 연결하는 모든 클라이언트는 다시 연결하려고 최대 세 번 허용됩니다. 기본값은 -1이며 고객은 무제한 시도를 허용합니다.

6.1.2. 페일오버 중 차단 호출 처리

페일오버가 발생하고 클라이언트가 브로커의 응답을 계속 실행하려고 기다리는 경우 새로 생성된 세션에는 진행 중인 호출에 대한 지식이 없습니다. 초기 호출은 제공되지 않는 응답을 기다리는 동안 영구적으로 중단될 수 있습니다. 이를 방지하기 위해 브로커는 예외를 발생시켜 장애 조치(failover) 시 진행 중인 모든 차단 호출의 차단을 해제하도록 설계되었습니다. 클라이언트 코드는 이러한 예외를 catch하고 원하는 경우 작업을 다시 시도할 수 있습니다.

AMQ Core Protocol JMS 클라이언트를 사용하는 경우 차단 해제된 메서드가 commit() 또는 prepare() 에 대한 호출인 경우 트랜잭션이 자동으로 롤백되고 브로커에서 예외가 발생합니다.

6.1.3. 트랜잭션을 통한 페일오버 처리

AMQ Core Protocol JMS 클라이언트를 사용하는 경우 세션이 트랜잭션이고 메시지가 현재 트랜잭션에서 이미 전송되었거나 승인되면 브로커는 장애 조치 중에 해당 메시지 또는 승인이 손실되었는지 확인할 수 없습니다. 결과적으로 트랜잭션은 롤백만 표시됩니다. 이후 커밋하려고 하면 javax.jms.TransactionRolledBackException 이 발생합니다.

주의

이 규칙에 대한 경고는 XA가 사용될 때입니다. 2단계 커밋을 사용하고 prepare() 가 이미 호출된 경우 롤백하면 HeuristicMixedException 이 발생할 수 있습니다. 이로 인해 커밋에서 XAException.XA_RETRY 예외가 발생하므로 트랜잭션 관리자가 나중에 커밋을 다시 시도해야 함을 알립니다. 원래 커밋이 발생하지 않은 경우에도 여전히 존재하며 커밋할 수 있습니다. 커밋이 존재하지 않는 경우 트랜잭션 관리자가 경고를 기록할 수 있지만 커밋된 것으로 간주됩니다. 이 예외의 부작용이 있는 경우 비영구적인 메시지가 손실됩니다. 이러한 손실을 방지하려면 XA를 사용할 때 항상 영구 메시지를 사용하십시오. prepare() 가 호출되기 전에 브로커로 플러시되므로 승인에 문제가 없습니다.

AMQ Core Protocol JMS 클라이언트 코드는 예외를 포착하고 필요한 클라이언트 측 롤백을 수행해야 합니다. 그러나 이미 롤백되었기 때문에 세션을 롤백할 필요가 없습니다. 그러면 사용자가 동일한 세션에서 트랜잭션 작업을 다시 시도할 수 있습니다.

커밋 호출이 실행될 때 페일오버가 발생하면 브로커가 호출을 차단하여 AMQ Core Protocol JMS 클라이언트가 응답을 무기한 대기하지 못하도록 합니다. 결과적으로 클라이언트는 오류가 발생하기 전에 마스터 브로커에서 트랜잭션 커밋이 실제로 처리되었는지 여부를 확인할 수 없습니다.

이를 해결하기 위해 AMQ Core Protocol JMS 클라이언트는 트랜잭션에서 중복 감지를 활성화하고 호출이 차단 해제된 후 다시 트랜잭션 작업을 재시도할 수 있습니다. 장애 조치 전에 마스터 브로커에서 트랜잭션이 성공적으로 커밋된 경우 중복 탐지를 수행하면 브로커 측에서 재시도할 때 트랜잭션에 있는 모든 장엄한 메시지가 무시됩니다. 이렇게 하면 메시지가 두 번 이상 전송되지 않습니다.

세션이 트랜잭션이 아닌 경우 장애 조치의 경우 메시지 또는 승인이 손실될 수 있습니다. 트랜잭션되지 않은 세션에 대해 한 번만 전달이 보장되고 한 번만 제공하려면 중복 탐지를 활성화하고 예외를 catch합니다.

6.1.4. 연결 실패에 대한 알림 받기

JMS는 연결 실패의 비동기식 알림을 받기 위한 표준 메커니즘인 java.jms.ExceptionListener 를 제공합니다.

연결에 실패한 경우 연결이 성공적으로 실패했는지, 다시 연결했는지, 다시 연결했는지 또는 다시 연결할 수 있는지에 관계없이 모든 ExceptionListener 또는 SessionFailureListener 인스턴스는 항상 브로커에 의해 호출됩니다. SessionFailureListener 에서 연결 Failed에 전달된 failedOver 플래그를 검사하여 재연결 또는 재연결 이 발생했는지 확인할 수 있습니다. 또는 다음 중 하나일 수 있는 javax.jms.JMSException 의 오류 코드를 검사할 수 있습니다.

표 6.1. JMSException 오류 코드

오류 코드설명

FAILOVER

장애 조치가 발생했으며 브로커가 성공적으로 다시 연결 또는 다시 연결되었습니다.

DISCONNECT

페일오버가 발생하지 않았으며 브로커의 연결이 끊어졌습니다.

6.2. 애플리케이션 수준 장애 조치

경우에 따라 자동 클라이언트 장애 조치를 원하지 않지만 대신 실패 처리기에서 자체 재연결 논리를 코딩하는 것을 선호합니다. 이는 애플리케이션 수준에서 장애 조치(failover)가 처리되므로 애플리케이션 수준 장애 조치라고 합니다.This is known as application-level failover, since the failover is handled at the application level.

JMS를 사용할 때 애플리케이션 수준 장애 조치를 구현하려면 JMS 연결에서 ExceptionListener 클래스를 설정합니다. ExceptionListener 는 연결 오류가 감지되는 경우 브로커에 의해 호출됩니다. ExceptionListener 에서 이전 JMS 연결을 종료해야 합니다. JNDI에서 새 연결 팩토리 인스턴스를 조회하고 새 연결을 생성할 수도 있습니다.

6.3. 손상된 연결 감지

브로커로부터 데이터를 수신하는 한 클라이언트는 연결을 활성으로 간주합니다. client-failure-check-period 속성에 대한 값을 제공하여 클라이언트가 실패 연결을 확인하도록 구성합니다. 네트워크 연결의 기본 검사 기간은 10.0.0.1밀리초 또는 30초이며, VM 내 연결에 대한 기본값은 -1이며, 이는 데이터가 수신되지 않은 경우 클라이언트가 해당 측에서 연결을 실패하지 않습니다.

일반적으로 점검 기간을 브로커의 연결 시간-라이브에 사용된 값보다 훨씬 낮게 설정하여 일시적인 오류가 발생할 경우 클라이언트가 다시 연결할 수 있도록 합니다.

손실된 연결 감지에 대한 검사 기간 설정

아래 예제에서는 확인 기간을 10,000밀리초로 설정하는 방법을 보여줍니다.

절차

  • JNDI를 사용하는 경우 JNDI 컨텍스트 환경(예: jndi.properties ) 내에서 검사 기간을 설정합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?clientFailureCheckPeriod=10000
  • JNDI를 사용하지 않는 경우, ActiveMQConnectionFactory.setClientFailureCheckPeriod() 에 값을 전달하여 검사 기간을 직접 설정합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setClientFailureCheckPeriod(10000);

6.4. TTL(Time-to-Live) 구성

기본적으로 클라이언트는 자체 연결에 대해 TTL(Time-to-Live)을 설정할 수 있습니다. 아래 예제에서는 TTL을 설정하는 방법을 보여줍니다.

절차

  • JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 매개 변수 connectionTtl 을 사용하여 XML 구성에서 지정할 수 있습니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?connectionTtl=30000
  • JNDI를 사용하지 않는 경우 연결 TTL은 ActiveMQConnectionFactory 인스턴스의 ConnectionTTL 특성에 의해 정의됩니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConnectionTTL(30000);

6.5. 연결 종료

클라이언트 애플리케이션이 종료된 연결이 발생하지 않도록 종료하기 전에 리소스를 제어하는 방식으로 닫아야 합니다. Java에서는 finally 블록 내에서 연결을 닫는 것이 좋습니다.

Connection jmsConnection = null;
try {
   ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...);
   jmsConnection = jmsConnectionFactory.createConnection();
   ...use the connection...
}
finally {
   if (jmsConnection != null) {
      jmsConnection.close();
   }
}

6.6. 동적 검색 구성

연결을 설정할 때 브로커 목록을 검색하도록 AMQ Core Protocol JMS를 구성할 수 있습니다.

클라이언트에서 JNDI를 사용하여 JMS 연결 팩토리 인스턴스를 조회하는 경우 JNDI 컨텍스트 환경에서 이러한 매개변수를 지정할 수 있습니다. 일반적으로 매개변수는 jndi.properties 라는 파일에 정의됩니다. 연결 팩토리에 대한 URI의 호스트와 부분은 broker.xml 구성 파일 내의 해당 broadcast-groupgroup-addressgroup-port 와 일치해야 합니다. 다음은 브로커의 검색 그룹에 연결하도록 구성된 jndi.properties 파일의 예입니다.

java.naming.factory.initial = ActiveMQInitialContextFactory
connectionFactory.myConnectionFactory=udp://231.7.7.7:9876

클라이언트 애플리케이션에 의해 JNDI에서 이 연결 팩토리를 다운로드하고 JMS 연결이 생성되면 해당 연결은 브로커의 검색 그룹 구성에 지정된 멀티 캐스트 주소를 수신하여 검색 그룹이 유지 관리하는 서버 목록에 부하를 분산합니다.

JNDI를 사용하는 대신 JMS 연결 팩토리를 생성할 때 Java 코드에서 직접 검색 그룹 매개 변수를 지정할 수 있습니다. 아래 코드는 이 작업을 수행하는 방법에 대한 예를 보여줍니다.

final String groupAddress = "231.7.7.7";
final int groupPort = 9876;

DiscoveryGroupConfiguration discoveryGroupConfiguration = new DiscoveryGroupConfiguration();
UDPBroadcastEndpointFactory udpBroadcastEndpointFactory = new UDPBroadcastEndpointFactory();
udpBroadcastEndpointFactory.setGroupAddress(groupAddress).setGroupPort(groupPort);
discoveryGroupConfiguration.setBroadcastEndpointFactory(udpBroadcastEndpointFactory);

ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithHA
    (discoveryGroupConfiguration, JMSFactoryType.CF);

Connection jmsConnection1 = jmsConnectionFactory.createConnection();
Connection jmsConnection2 = jmsConnectionFactory.createConnection();

setter 메서드 setRefreshTimeout() 을 사용하여 DiscoveryGroupConfiguration 에서 새로 고침 시간 초과를 직접 설정할 수 있습니다. 기본값은 10000밀리초입니다.

첫 번째 사용 시 연결 팩토리에서 첫 번째 연결을 생성하기 전에 생성 이후 이 기간이 대기 중인지 확인합니다. 기본 대기 시간은 10000밀리초이지만 새 값을 DiscoveryGroupConfiguration.setDiscoveryInitialWaitTimeout() 에 전달하여 변경할 수 있습니다.

6.7. 정적 검색 구성

사용 중인 네트워크에서 UDP를 사용하는 것이 불가능할 수 있습니다. 이 경우 사용 가능한 서버의 초기 목록을 사용하여 연결을 구성할 수 있습니다. 목록은 항상 사용할 수 있는 하나의 브로커 또는 하나 이상의 사용 가능한 브로커 목록일 수 있습니다.

이는 모든 서버가 호스팅되는 위치를 알아야 한다는 의미는 아닙니다. 신뢰할 수 있는 서버를 사용하여 에 연결하도록 이러한 서버를 구성할 수 있습니다. 연결 정보가 연결되면 연결 세부 정보가 서버에서 클라이언트로 전파됩니다.

클라이언트에서 JNDI를 사용하여 JMS 연결 팩토리 인스턴스를 조회하는 경우 JNDI 컨텍스트 환경에서 이러한 매개변수를 지정할 수 있습니다. 일반적으로 매개변수는 jndi.properties 라는 파일에 정의됩니다. 다음은 동적 검색을 사용하는 대신 브로커의 정적 목록을 제공하는 jndi.properties 파일의 예입니다.

java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
connectionFactory.myConnectionFactory=(tcp://myhost:61616,tcp://myhost2:61616)

위의 연결 팩토리를 클라이언트가 사용하는 경우 해당 연결은차단 () 내에 정의된 브로커 목록에 걸쳐 부하 분산됩니다.

JMS 연결 팩토리를 직접 인스턴스화하는 경우 아래 예제와 같이 JMS 연결 팩토리를 생성할 때 커넥터 목록을 명시적으로 지정할 수 있습니다.

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("host", "myhost");
map.put("port", "61616");
TransportConfiguration broker1 = new TransportConfiguration
    (NettyConnectorFactory.class.getName(), map);

HashMap<String, Object> map2 = new HashMap<String, Object>();
map2.put("host", "myhost2");
map2.put("port", "61617");
TransportConfiguration broker2 = new TransportConfiguration
    (NettyConnectorFactory.class.getName(), map2);

ActiveMQConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithHA
    (JMSFactoryType.CF, broker1, broker2);

6.8. 브로커 커넥터 구성

커넥터는 클라이언트가 브로커에 연결하는 방법을 정의합니다. JMS 연결 팩토리를 사용하여 클라이언트에서 구성할 수 있습니다.

Map<String, Object> connectionParams = new HashMap<String, Object>();

connectionParams.put(org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants.PORT_PROP_NAME, 61617);

TransportConfiguration transportConfiguration =
    new TransportConfiguration(
    "org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory", connectionParams);

ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration);

Connection jmsConnection = connectionFactory.createConnection();

7장. 메시지 전달

7.1. 스트리밍된 큰 메시지에 쓰기

큰 메시지에 작성하려면 10.0.0.1s Message.writeBytes() 메서드를 사용합니다. 다음 예제에서는 파일에서 바이트를 읽고 메시지에 씁니다.

예: 스트리밍된 큰 메시지로 설정

BytesMessage message = session.createBytesMessage();
File inputFile = new File(inputFilePath);
InputStream inputStream = new FileInputStream(inputFile);

int numRead;
byte[] buffer = new byte[1024];

while ((numRead = inputStream.read(buffer, 0, buffer.length)) != -1) {
    message.writeBytes(buffer, 0, numRead);
}

7.2. 스트리밍된 큰 메시지에서 읽기

큰 메시지에서 읽으려면 10.0.0.1s Message.readBytes() 메서드를 사용합니다. 다음 예제에서는 메시지에서 바이트를 읽고 파일에 씁니다.

예: 스트리밍된 큰 메시지에서 읽기

BytesMessage message = (BytesMessage) consumer.receive();
File outputFile = new File(outputFilePath);
OutputStream outputStream = new FileOutputStream(outputFile);

int numRead;
byte buffer[] = new byte[1024];

for (int pos = 0; pos < message.getBodyLength(); pos += buffer.length) {
    numRead = message.readBytes(buffer);
    outputStream.write(buffer, 0, numRead);
}

7.3. 메시지 그룹 사용

메시지 그룹은 다음과 같은 특징이 있는 메시지 집합입니다.

  • 메시지 그룹의 메시지는 동일한 그룹 ID를 공유합니다. 즉, 동일한 그룹 식별자 속성을 갖습니다. JMS 메시지의 경우 속성은 JMSXGroupID 입니다.
  • 메시지 그룹의 메시지는 큐에 많은 소비자가 있더라도 항상 동일한 소비자가 사용합니다. 다른 소비자는 원래 소비자가 닫히는 경우 메시지 그룹을 수신하도록 선택됩니다.

메시지 그룹은 속성의 특정 값에 대한 모든 메시지를 동일한 소비자가 직렬로 처리하려는 경우 유용합니다. 예를 들어 특정 스포일 구매에 대한 주문이 동일한 소비자에 의해 순차적으로 처리되도록 할 수 있습니다. 이렇게 하려면 소비자 풀을 만든 다음 스톡 이름을 메시지 속성 값으로 설정할 수 있습니다.To do this, you could create a pool of consumers and then set the shares as the value of the message property. 이렇게 하면 특정 제품의 모든 메시지가 항상 동일한 소비자가 처리합니다.

그룹 ID 설정

아래 예제에서는 AMQ Core Protocol JMS와 함께 메시지 그룹을 사용하는 방법을 보여줍니다.

절차

  • JNDI를 사용하여 JMS 클라이언트에 대한 JMS 연결 팩토리를 설정하는 경우 groupID 매개변수를 추가하고 값을 제공합니다. 이 연결 팩토리를 사용하여 전송된 모든 메시지에는 속성 JMSXGroupID 가 지정된 값으로 설정됩니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?groupID=MyGroup
  • JNDI를 사용하지 않는 경우 setStringProperty() 메서드를 사용하여 JMSXGroupID 속성을 설정합니다.

     Message message = new TextMessage();
     message.setStringProperty("JMSXGroupID", "MyGroup");
     producer.send(message);

추가 리소스

메시지 그룹 구성 및 사용 방법에 대한 작업 예제는 < install-dir> /examples/features/standard 아래의 message-groupmessage-group2 를 참조하십시오.

7.4. 중복 메시지 탐지 사용

AMQ Broker에는 수신한 중복 메시지를 필터링하여 자체 중복 탐지 논리를 코딩할 필요가 없는 자동 중복 메시지 탐지가 포함되어 있습니다.

중복 메시지 탐지를 활성화하려면 메시지 속성 _AMQ_DUPL_ID 에 고유한 값을 입력합니다. 브로커가 메시지를 수신하면 _AMQ_DUPL_ID 에 값이 있는지 확인합니다. 이 경우 브로커는 메모리 캐시에서 확인하여 해당 값이 이미 메시지를 수신했는지 확인합니다. 동일한 값을 가진 메시지가 발견되면 들어오는 메시지가 무시됩니다.

트랜잭션에서 메시지를 보내는 경우 트랜잭션의 모든 메시지에 대해 _AMQ_DUPL_ID 를 설정하지 않아도 됩니다. 브로커가 트랜잭션의 모든 메시지에 대해 중복 메시지를 감지하면 전체 트랜잭션을 무시합니다.

중복 ID 메시지 속성 설정

다음 예제에서는 AMQ Core Protocol JMS를 사용하여 중복 탐지 속성을 설정하는 방법을 보여줍니다. 편의를 위해 클라이언트는 중복 ID 속성 이름인 _ AMQ_DUPLECTION_ID에 대해 org.apache.activemq.artemis.api.Message.HDR_DUPLICATE_DETECTION _ID 값을 사용합니다.

절차

_AMQ_DUPL_ID 값을 고유한 문자열 값으로 설정합니다.

Message jmsMessage = session.createMessage();
String myUniqueID = "This is my unique id";
message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID);

7.5. 메시지 인터셉터 사용

AMQ Core Protocol JMS를 사용하면 클라이언트를 입력 또는 종료하는 패킷을 인터셉트할 수 있으므로 패킷을 감사하거나 메시지를 필터링할 수 있습니다. 인터셉터는 가로채는 패킷을 변경할 수 있습니다. 그러면 인터셉터가 강력하지만 주의해서 사용해야 하는 기능이기도 합니다.

인터셉터는 부울 값을 반환하는 intercept() 메서드를 구현해야 합니다. 반환된 값이 true 이면 메시지 패킷은 계속됩니다. 반환된 값이 false 이면 프로세스가 중단되고 다른 인터셉터가 호출되지 않으며 메시지 패킷은 더 이상 처리되지 않습니다.

발신 패킷이 전송 모드로 전송되는 경우를 제외하고 메시지 가로채기(Message interception)는 주 클라이언트 코드에 투명하게 수행됩니다. 차단을 활성화하여 나가는 패킷이 전송되고 해당 패킷이 false 를 반환하는 인터셉터가 발생하면 ActiveMQException이 호출자에게 발생합니다. throw된 예외에는 인터셉터의 이름이 포함됩니다.

인터셉터는 org.apache.artemis.activemq.api.core.Interceptor 인터페이스를 구현해야 합니다. 클라이언트 인터셉터 클래스와 해당 종속 항목을 올바르게 인스턴스화하고 호출하려면 클라이언트의 Java 클래스 경로에 추가해야 합니다.

package com.example;

import org.apache.artemis.activemq.api.core.Interceptor;
import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;

public class MyInterceptor implements Interceptor {
    private final int ACCEPTABLE_SIZE = 1024;

    @Override
    boolean intercept(Packet packet, RemotingConnection connection) throws ActiveMQException {
        int size = packet.getPacketSize();
        if (size <= ACCEPTABLE_SIZE) {
            System.out.println("This Packet has an acceptable size.");
            return true;
        }
        return false;
    }
}

8장. 흐름 제어

흐름 제어는 생산자와 소비자가 그 사이의 데이터 흐름을 제한함으로써 과부하되지 않도록 합니다. AMQ Core Protocol JMS를 사용하면 소비자와 생산자 모두에 대한 흐름 제어를 구성할 수 있습니다.

소비자 흐름 제어

소비자 흐름 제어는 클라이언트가 브로커의 메시지를 소비하므로 브로커와 클라이언트 간의 데이터 흐름을 규제합니다. AMQ Core Protocol JMS는 소비자에게 전달하기 전에 기본적으로 메시지를 버퍼링합니다. 버퍼가 없으면 클라이언트는 먼저 브로커를 사용하기 전에 각 메시지를 요청해야 합니다. 이러한 유형의 "round-trip" 통신은 비용이 많이 듭니다. 클라이언트 측의 데이터 흐름을 규제하는 것은 소비자가 메시지를 충분히 처리할 수 없고 버퍼가 들어오는 메시지로 오버플로우를 시작할 때 메모리 부족 문제가 발생할 수 있기 때문에 중요합니다.

생산자 흐름 제어

소비자 창 기반 흐름 제어와 유사한 방식으로 클라이언트는 데이터 양을 생산자로 제한하여 브로커가 너무 많은 데이터로 과부하되지 않도록 할 수 있습니다. 프로듀서의 경우 창 크기는 한 번에 이동할 수 있는 바이트 수를 결정합니다.

8.1. 소비자 창 크기 설정

클라이언트 쪽 버퍼에 보관된 최대 메시지 크기는 창 크기에 따라 결정됩니다. AMQ Core Protocol JMS의 기본 창 크기는 1MiB 또는 1024 * 1024바이트입니다. 대부분의 사용 사례에서 기본값은 정상입니다. 다른 경우 창 크기의 최적 값을 찾으려면 시스템 벤치마킹이 필요할 수 있습니다. default를 변경해야 하는 경우 AMQ Core Protocol JMS를 사용하면 버퍼 창 크기를 설정할 수 있습니다.

다음 예제에서는 AMQ Core Protocol JMS를 사용할 때 소비자 창 크기 매개 변수를 설정하는 방법을 보여줍니다. 각 예제에서는 소비자 창 크기를 300,000바이트로 설정합니다.

절차

  • 클라이언트에서 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로 consumerWindowSize 매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는 jndi.properties 파일을 사용하여 URL을 저장합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
  • 클라이언트에서 연결 팩토리를 인스턴스화하는 데 JNDI를 사용하지 않는 경우 ActiveMQConnectionFactory.setConsumerWindowSize() 에 값을 전달합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerWindowSize(300000);

8.2. 생산자 창 크기 설정

창 크기는 창의 각 바이트에 대해 한 번의 크립션을 기반으로 브로커와 프로듀서 간에 협상됩니다. 메시지가 전송되고 프로젝션이 사용되는 경우, 생산자는 더 많은 메시지를 보내기 전에 프로듀서가 요청되고 브로커의 교집합을 부여해야합니다. 생산자와 브로커 간의 교집합을 교환하면 생산자와 브로커 간의 데이터 흐름이 규제됩니다.

다음 예제에서는 AMQ Core Protocol JMS를 사용할 때 생산자 창 크기를 1024바이트로 설정하는 방법을 보여줍니다.

절차

  • 클라이언트에서 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로 producerWindowSize 매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는 jndi.properties 파일을 사용하여 URL을 저장합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616?producerWindowSize=1024
  • 클라이언트에서 연결 팩토리를 인스턴스화하는 데 JNDI를 사용하지 않는 경우 해당 값을 ActiveMQConnectionFactory.setProducerWindowSize() 로 전달합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setProducerWindowSize(1024);

8.3. 빠른 소비자 처리

빠른 소비자는 메시지를 사용하는 만큼 빠르게 처리할 수 있습니다. 메시징 시스템의 소비자가 해당 속도가 빠르면 창 크기를 -1로 설정하는 것이 좋습니다. 창 크기를 이 값으로 설정하면 클라이언트에서 바인딩되지 않은 메시지가 버퍼링됩니다. 그러나 이 설정은 신중하게 사용합니다. 소비자가 메시지를 수신하는 즉시 메시지를 처리할 수 없는 경우 클라이언트의 메모리가 오버플로될 수 있습니다.

빠른 소비자를 위한 창 크기 설정

아래 예제에서는 메시지의 빠른 소비자인 AMQ Core Protocol JMS 클라이언트를 사용할 때 창 크기를 -1로 설정하는 방법을 보여줍니다.

절차

  • 클라이언트에서 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로 consumerWindowSize 매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는 jndi.properties 파일을 사용하여 URL을 저장합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=-1
  • 클라이언트에서 연결 팩토리를 인스턴스화하는 데 JNDI를 사용하지 않는 경우 ActiveMQConnectionFactory.setConsumerWindowSize() 에 값을 전달합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerWindowSize(-1);

8.4. 느린 소비자 처리

느린 소비자는 각 메시지를 처리하는 데 상당한 시간이 걸립니다. 이 경우 클라이언트에서 메시지를 버퍼링하지 않는 것이 좋습니다. 메시지는 다른 소비자가 사용할 준비가 된 브로커에 남아 있습니다. 버퍼를 끄는 한 가지 이점은 큐에서 여러 소비자 간에 결정적 분산을 제공한다는 것입니다. 클라이언트 쪽 버퍼를 비활성화하여 느린 소비자를 처리하려면 창 크기를 0으로 설정합니다.

느린 사용자의 창 크기 설정

아래 예제에서는 메시지의 느린 소비자인 AMQ Core Protocol JMS 클라이언트를 사용할 때 창 크기를 0으로 설정하는 방법을 보여줍니다.

절차

  • 클라이언트에서 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로 consumerWindowSize 매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는 jndi.properties 파일을 사용하여 URL을 저장합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=0
  • 클라이언트에서 연결 팩토리를 인스턴스화하는 데 JNDI를 사용하지 않는 경우 ActiveMQConnectionFactory.setConsumerWindowSize() 에 값을 전달합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerWindowSize(0);

추가 리소스

느린 소비자를 처리할 때 소비자 버퍼링을 방지하기 위해 브로커를 구성하는 방법을 보여주는 예제는 예제는 < install-dir> /examples/표준 에서 no-consumer-buffering 예제를 참조하십시오.

8.5. 메시지 소비 속도 설정

소비자가 메시지를 사용할 수 있는 속도를 규제할 수 있습니다. 또한 제한 으로 알려진 소비 속도를 규제하여 소비자가 구성에서 허용하는 것보다 빠른 속도로 메시지를 소비하지 않도록 합니다.

참고

속도 제한 흐름 제어는 창 기반 흐름 제어와 함께 사용할 수 있습니다. 속도 제한 흐름 제어는 클라이언트가 초당 사용할 수 있는 메시지 수와 버퍼에 있는 메시지 수에 영향을 미치지 않습니다. 속도 제한과 높은 창 기반 제한을 사용하면 클라이언트의 내부 버퍼가 메시지로 빠르게 채워집니다.

이 기능을 사용하려면 비율이 양수 정수여야 하며 초당 메시지 단위에 지정된 최대 메시지 소비 속도입니다. 속도를 -1로 설정하면 속도 제한 흐름 제어가 비활성화됩니다. 기본값은 -1입니다.

아래 예제에서는 사용 메시지의 속도를 초당 10개의 메시지로 제한하는 클라이언트를 보여줍니다.

절차

  • 클라이언트에서 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로 consumerMaxRate 매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는 jndi.properties 파일을 사용하여 URL을 저장합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616?consumerMaxRate=10
  • 클라이언트에서 연결 팩토리를 인스턴스화하는 데 JNDI를 사용하지 않는 경우 해당 값을 ActiveMQConnectionFactory.setConsumerMaxRate() 에 전달합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setConsumerMaxRate(10);

추가 리소스

소비자 속도를 제한하는 방법의 작동 예는 < install-dir> /examples/standardconsumer-rate-limit 예제를 참조하십시오.

8.6. 메시지 프로덕션의 속도 설정

AMQ Core Protocol JMS는 생산자가 메시지를 보내는 속도를 제한할 수도 있습니다. 생산자 비율은 초당 메시지 단위로 지정됩니다. 기본값인 -1로 설정하면 속도가 제한된 흐름 제어가 비활성화됩니다.

아래 예제에서는 생산자가 AMQ Core Protocol JMS를 사용할 때 메시지 전송 속도를 설정하는 방법을 보여줍니다. 각 예제에서는 최대 속도를 초당 10개의 메시지로 설정합니다.

절차

  • 클라이언트에서 JNDI를 사용하여 연결 팩토리를 인스턴스화하는 경우 연결 문자열 URL의 일부로 producerMaxRate 매개변수를 포함합니다. JNDI 컨텍스트 환경에 URL을 저장합니다. 아래 예제에서는 jndi.properties 파일을 사용하여 URL을 저장합니다.

    java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616?producerMaxRate=10
  • 클라이언트에서 연결 팩토리를 인스턴스화하는 데 JNDI를 사용하지 않는 경우 해당 값을 ActiveMQConnectionFactory.setProducerMaxRate() 에 전달합니다.

    ConnectionFactory cf =  ActiveMQJMSClient.createConnectionFactory(...)
    cf.setProducerMaxRate(10);

추가 리소스

메시지 전송 속도를 제한하는 방법에 대한 작업 예제는 < install-dir> /examples/standardproducer-rate-limit 예제를 참조하십시오.

부록 A. 서브스크립션 사용

AMQ는 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.

A.1. 귀하의 계정에 액세스

절차

  1. access.redhat.com 으로 이동합니다.
  2. 아직 계정이 없는 경우 계정을 생성합니다.
  3. 계정에 로그인합니다.

A.2. 서브스크립션 활성화

절차

  1. access.redhat.com 으로 이동합니다.
  2. 내 서브스크립션으로 이동합니다.
  3. 서브스크립션을 활성화하여 16자리 활성화 번호를 입력합니다.

A.3. 릴리스 파일 다운로드

.zip, .tar.gz 및 기타 릴리스 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지 또는 Red Hat Maven 리포지토리를 사용하는 경우에는 이 단계가 필요하지 않습니다.

절차

  1. 브라우저를 열고 access.redhat.com/downloads 에서 Red Hat 고객 포털 제품 다운로드 페이지에 로그인합니다.
  2. INTEGRATION AND AUTOMATION 카테고리에서 Red Hat AMQ 항목을 찾습니다.
  3. 원하는 AMQ 제품을 선택합니다. Software Download 페이지가 열립니다.
  4. 구성 요소에 대한 다운로드 링크를 클릭합니다.

A.4. 패키지용 시스템 등록

Red Hat Enterprise Linux에 이 제품의 RPM 패키지를 설치하려면 시스템을 등록해야 합니다. 다운로드한 릴리스 파일을 사용하는 경우 이 단계는 필요하지 않습니다.

절차

  1. access.redhat.com 으로 이동합니다.
  2. Registration Assistant 로 이동합니다.
  3. OS 버전을 선택하고 다음 페이지로 이동합니다.
  4. 시스템 터미널에서 나열된 명령을 사용하여 등록을 완료합니다.

시스템 등록에 대한 자세한 내용은 다음 리소스 중 하나를 참조하십시오.

부록 B. Red Hat Maven 리포지토리 사용

이 섹션에서는 소프트웨어에서 Red Hat 제공 Maven 리포지토리를 사용하는 방법에 대해 설명합니다.

B.1. 온라인 리포지토리 사용

Red Hat은 Maven 기반 프로젝트와 함께 사용할 중앙 Maven 리포지토리를 유지 관리합니다. 자세한 내용은 리포지토리 시작 페이지를 참조하십시오.

Red Hat 리포지토리를 사용하도록 Maven을 구성하는 방법은 다음 두 가지가 있습니다.

Maven 설정에 리포지토리 추가

이 구성 방법은 POM 파일이 리포지토리 구성을 재정의하지 않고 포함된 프로필이 활성화된 경우 사용자가 소유한 모든 Maven 프로젝트에 적용됩니다.

절차

  1. Maven settings.xml 파일을 찾습니다. 일반적으로 사용자 홈 디렉터리의 .m2 디렉토리 내에 있습니다. 파일이 없는 경우 텍스트 편집기를 사용하여 생성합니다.

    Linux 또는 UNIX에서:

    /home/<username>/.m2/settings.xml

    Windows에서 다음을 수행합니다.

    C:\Users\<username>\.m2\settings.xml
  2. 다음 예제와 같이 Red Hat 리포지토리를 포함하는 새 프로필을 settings.xml 파일의 profiles 요소에 추가합니다.

    예: Red Hat 리포지토리가 포함된 Maven settings.xml 파일

    <settings>
      <profiles>
        <profile>
          <id>red-hat</id>
          <repositories>
            <repository>
              <id>red-hat-ga</id>
              <url>https://maven.repository.redhat.com/ga</url>
            </repository>
          </repositories>
          <pluginRepositories>
            <pluginRepository>
              <id>red-hat-ga</id>
              <url>https://maven.repository.redhat.com/ga</url>
              <releases>
                <enabled>true</enabled>
              </releases>
              <snapshots>
                <enabled>false</enabled>
              </snapshots>
            </pluginRepository>
          </pluginRepositories>
        </profile>
      </profiles>
      <activeProfiles>
        <activeProfile>red-hat</activeProfile>
      </activeProfiles>
    </settings>

Maven 구성에 대한 자세한 내용은 Maven 설정 참조 를 참조하십시오.

POM 파일에 리포지토리 추가

프로젝트에서 직접 리포지토리를 구성하려면 다음 예와 같이 POM 파일의 repositories 요소에 새 항목을 추가합니다.

예: Red Hat 리포지토리가 포함된 Maven pom.xml 파일

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>example-app</artifactId>
  <version>1.0.0</version>

  <repositories>
    <repository>
      <id>red-hat-ga</id>
      <url>https://maven.repository.redhat.com/ga</url>
    </repository>
  </repositories>
</project>

POM 파일 구성에 대한 자세한 내용은 Maven POM 참조 를 참조하십시오.

B.2. 로컬 리포지터리 사용

Red Hat은 일부 구성 요소에 파일 기반 Maven 리포지토리를 제공합니다. 이러한 파일은 로컬 파일 시스템으로 추출할 수 있는 다운로드 가능한 아카이브로 제공됩니다.

로컬 추출된 리포지토리를 사용하도록 Maven을 구성하려면 Maven 설정 또는 POM 파일에 다음 XML을 적용합니다.

<repository>
  <id>red-hat-local</id>
  <url>${repository-url}</url>
</repository>

${repository-url} 은 추출된 리포지토리의 로컬 파일 시스템 경로가 포함된 파일 URL이어야 합니다.

표 B.1. 로컬 Maven 리포지토리의 URL 예

운영 체제파일 시스템 경로URL

Linux 또는 UNIX

/home/alice/maven-repository

file:/home/alice/maven-repository

Windows

C:\repos\red-hat

file:C:\repos\red-hat

부록 C. 예와 함께 AMQ Broker 사용

AMQ Core Protocol JMS 예제에서는 exampleQueue 라는 큐가 있는 메시지 브로커를 실행해야 합니다. 아래 절차를 사용하여 브로커를 설치 및 시작하고 대기열을 정의합니다.

C.1. 브로커 설치

AMQ Broker 시작하기 의 지침에 따라 브로커를 설치하고 브로커 인스턴스를 생성합니다. 익명 액세스를 활성화합니다.

다음 절차에서는 브로커 인스턴스의 위치를 < broker-instance-dir>으로 참조합니다.

C.2. 브로커 시작

절차

  1. artemis run 명령을 사용하여 브로커를 시작합니다.

    $ <broker-instance-dir>/bin/artemis run
  2. 콘솔 출력에 시작 중에 기록된 심각한 오류가 있는지 확인합니다. 브로커 로그 서버는 이제 준비될 때 활성화됩니다.

    $ example-broker/bin/artemis run
               __  __  ____    ____            _
         /\   |  \/  |/ __ \  |  _ \          | |
        /  \  | \  / | |  | | | |_) |_ __ ___ | | _____ _ __
       / /\ \ | |\/| | |  | | |  _ <| '__/ _ \| |/ / _ \ '__|
      / ____ \| |  | | |__| | | |_) | | | (_) |   <  __/ |
     /_/    \_\_|  |_|\___\_\ |____/|_|  \___/|_|\_\___|_|
    
     Red Hat AMQ <version>
    
    2020-06-03 12:12:11,807 INFO  [org.apache.activemq.artemis.integration.bootstrap] AMQ101000: Starting ActiveMQ Artemis Server
    ...
    2020-06-03 12:12:12,336 INFO  [org.apache.activemq.artemis.core.server] AMQ221007: Server is now live
    ...

C.3. 대기열 생성

새 터미널에서 artemis queue 명령을 사용하여 exampleQueue 라는 큐를 생성합니다.

$ <broker-instance-dir>/bin/artemis queue create --name exampleQueue --address exampleQueue --auto-create-address --anycast

일련의 yes 또는 no 질문에 대답하라는 메시지가 표시됩니다. N (아니)에게 모두 대답합니다.

큐가 생성되면 브로커는 예제 프로그램과 함께 사용할 준비가 된 것입니다.

C.4. 브로커 중지

예제 실행을 완료하면 artemis stop 명령을 사용하여 브로커를 중지합니다.

$ <broker-instance-dir>/bin/artemis stop

2023-05-17에 최종 업데이트된 문서

법적 공지

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.