AMQ JMS Client 사용

Red Hat AMQ Clients 2.11

AMQ Clients 2.11과 함께 사용

초록

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

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

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

1장. 개요

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

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

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

1.1. 주요 기능

  • JMS 1.1 및 2.0 호환 가능
  • 보안 통신을 위한 SSL/TLS
  • 유연한 SASL 인증
  • 자동 재연결 및 페일오버
  • OSGi 컨테이너와 함께 사용 가능
  • pure-Java 구현
  • OpenTracing 표준을 기반으로 분산 추적

    중요

    AMQ Clients의 분산 추적은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다. Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 https://access.redhat.com/support/offerings/techpreview/를 참조하십시오.

참고

AMQ JMS는 현재 분산 트랜잭션(XA)을 지원하지 않습니다. 애플리케이션에 분산 트랜잭션이 필요한 경우 AMQ Core Protocol JMS 클라이언트를 사용하는 것이 좋습니다.

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

AMQ JMS는 업계에서 인정하는 다음 표준 및 네트워크 프로토콜을 지원합니다.

1.3. 지원되는 구성

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

1.4. 용어 및 개념

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

표 1.1. API 용어

엔터티설명

ConnectionFactory

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

연결

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

세션

메시지를 생성하고 사용하는 컨텍스트입니다. 여기에는 메시지 생산자와 소비자가 포함됩니다.

MessageProducer

대상에 메시지를 전송하는 채널입니다. 대상 대상이 있습니다.

MessageConsumer

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

대상

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

대기열

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

주제

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

메시지

애플리케이션별 정보.

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

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

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

큐는 지점 간 의미 체계를 구현합니다.A queue implements point-to-point semantics. 각 메시지는 한 명의 소비자가 볼 수 있으며 메시지를 읽은 후 큐에서 제거됩니다. 주제는 게시-서브스크립션 의미 체계를 구현합니다. 각 메시지는 여러 소비자가 볼 수 있으며 메시지를 읽은 후에는 다른 소비자가 계속 사용할 수 있습니다.

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

1.5. 문서 규칙

sudo 명령

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

파일 경로

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

변수 텍스트

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

$ cd <project-dir>

2장. 설치

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

2.1. 사전 요구 사항

  • AMQ 릴리스 파일 및 리포지토리에 액세스하려면 서브스크립션이 있어야 합니다.
  • AMQ JMS를 사용하여 프로그램을 빌드하려면 Apache Maven 을 설치해야 합니다.
  • AMQ 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.qpid</groupId>
      <artifactId>qpid-jms-client</artifactId>
      <version>1.5.0.redhat-00001</version>
    </dependency>

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

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

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

프로세스

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

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

    $ unzip amq-clients-2.11.0-jms-maven-repository.zip

    Windows에서 .zip 파일을 마우스 오른쪽 버튼으로 클릭하고 Extract All 을 선택합니다.

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

2.4. 예제 설치

프로세스

  1. git clone 명령을 사용하여 소스 리포지토리를 qpid-jms 라는 로컬 디렉터리에 복제합니다.

    $ git clone https://github.com/apache/qpid-jms.git qpid-jms
  2. qpid-jms 디렉터리로 변경하고 git checkout 명령을 사용하여 1.5.0 분기로 전환합니다.

    $ cd qpid-jms
    $ git checkout 1.5.0

결과 로컬 디렉터리를 이 문서 전체에서 &lt ;source-dir&gt;이라고 합니다.

3장. 시작하기

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

3.1. 사전 요구 사항

3.2. Hello World 실행

Hello World 예제에서는 브로커에 대한 연결을 생성하고 큐 큐에 인사말을 포함하는 메시지를 전송한 다음 다시 수신합니다. 성공하면 수신된 메시지를 콘솔에 출력합니다.

프로세스

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

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

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

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

    Linux 또는 UNIX의 경우:

    $ java -cp "target/classes:target/dependency/*" org.apache.qpid.jms.example.HelloWorld

    Windows에서:

    > java -cp "target\classes;target\dependency\*" org.apache.qpid.jms.example.HelloWorld

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

$ java -cp "target/classes/:target/dependency/*" org.apache.qpid.jms.example.HelloWorld
Hello world!

예제의 소스 코드는 < source-dir> /qpid-jms-examples/src/main/java 디렉터리에 있습니다. JNDI 및 로깅 구성은 < source-dir> /qpid-jms-examples/src/main/resources 디렉터리에 있습니다.

4장. 설정

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

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

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

4.1. JNDI 초기 컨텍스트 구성

JMS 애플리케이션은 InitialContext Factory 에서 얻은 JNDI InitialContext 오브젝트를 사용하여 연결 팩토리와 같은 JMS 개체를 조회합니다. AMQ JMS는 org.apache.qpid.jms.jndi.Jms 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.qpid.jms.jndi.JmsInitialContextFactory

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

시스템 속성 사용

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

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

$ java -Djava.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory ...

초기 컨텍스트 API 사용

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

예: JNDI 속성 프로그래밍 방식으로 설정

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

env.put("java.naming.factory.initial", "org.apache.qpid.jms.jndi.JmsInitialContextFactory");

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 = amqp://example.net:5672?jms.clientID=backend

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

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

4.3. 연결 URI

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

연결 URI 형식

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

스키마는 암호화되지 않은 연결에 대한 amqp 이며 SSL/TLS 연결을 위한 amqps 입니다.

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

예: 연결 URI

amqp://example.net:5672?jms.clientID=backend

장애 조치 URI

장애 조치가 구성되면 현재 서버에 대한 연결이 끊어지면 클라이언트가 다른 서버에 자동으로 다시 연결할 수 있습니다. 장애 조치(failover) URI에는 장애 조치( failover): 가 있으며 Geneve 내에 쉼표로 구분된 연결 URI 목록을 포함합니다. 추가 옵션은 끝에 지정됩니다.

장애 조치 URI 형식

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

예를 들어 다음은 두 호스트 host1 또는 host2 중 하나에 연결할 수 있는 장애 조치 URI입니다.

예: 장애 조치 URI

failover:(amqp://host1:5672,amqp://host2:5672)?jms.clientID=backend

연결 URI 예제와 마찬가지로 장애 조치 구성의 URI를 사용하여 다양한 설정으로 클라이언트를 구성할 수 있습니다. 이러한 설정은 5장. 구성 옵션 에 자세히 설명되어 있으며 5.5절. “장애 조치 옵션” 섹션은 특히 중요합니다.

SSL/TLS 서버 이름 표시

amqps 스키마가 SSL/TLS 연결을 지정하는 데 사용되는 경우 URI의 호스트 세그먼트는 JVM의 TLS 서버 이름 표시(SNI) 확장에서 사용하여 TLS 핸드셰이크 중에 원하는 서버 호스트 이름을 전달할 수 있습니다. 정규화된 도메인 이름(예: "myhost.mydomain")이 지정되었지만 정규화되지 않은 이름(예: "myhost") 또는 베어 IP 주소가 사용되는 경우 SNI 확장이 자동으로 포함됩니다.

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");

4.5. JNDI 속성의 변수 확장

JNDI 속성 값에는 ${ <variable-name>} 형식의 변수가 포함될 수 있습니다. 라이브러리는 다음 위치에서 순서대로 검색하여 변수 값을 확인합니다.

  • Java 시스템 속성
  • OS 환경 변수
  • JNDI 속성 파일 또는 환경

예를 들어 Linux ${HOME} 에서 현재 사용자의 홈 디렉터리인 HOME 환경 변수로 확인됩니다.

${ <variable-name> :- <default-value> } 구문을 사용하여 기본값 을 제공할 수 있습니다. < variable-name&gt;에 대한 값이 없으면 기본값이 대신 사용됩니다.

5장. 구성 옵션

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

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

5.1. JMS 옵션

이러한 옵션은 연결,세션,MessageConsumerMessageProducer 와 같은 JMS 개체의 동작을 제어합니다.

jms.username
클라이언트가 연결을 인증하는 데 사용하는 사용자 이름입니다.
jms.password
클라이언트가 연결을 인증하는 데 사용하는 암호입니다.
jms.clientID
클라이언트가 연결에 적용하는 클라이언트 ID입니다.
jms.forceAsyncSend
활성화하면 MessageProducer 의 모든 메시지가 비동기적으로 전송됩니다. 그렇지 않으면 비영구 메시지 또는 트랜잭션 내부 메시지와 같은 특정 종류만 비동기적으로 전송됩니다. 기본적으로 비활성화되어 있습니다.
jms.forceSyncSend
활성화하면 MessageProducer 의 모든 메시지가 동기적으로 전송됩니다. 기본적으로 비활성화되어 있습니다.
jms.forceAsyncAcks
활성화된 경우 모든 메시지 확인은 비동기적으로 전송됩니다. 기본적으로 비활성화되어 있습니다.
jms.localMessageExpiry
활성화하면 MessageConsumer 에서 수신한 만료된 메시지가 필터링되어 전달되지 않습니다. 기본적으로 활성화되어 있습니다.
jms.localMessagePriority
활성화된 경우 메시지 우선 순위 값에 따라 사전 페치된 메시지가 로컬로 다시 정렬됩니다. 기본적으로 비활성화되어 있습니다.
jms.validatePropertyNames
활성화된 경우 메시지 속성 이름은 유효한 Java 식별자여야 합니다. 기본적으로 활성화되어 있습니다.
jms.receiveLocalOnly
활성화된 경우 시간 초과 인수를 사용하여 수신할 호출은 소비자의 로컬 메시지 버퍼만 확인합니다. 그렇지 않으면 제한 시간이 만료되면 원격 피어가 실제로 메시지가 없는지 확인합니다. 기본적으로 비활성화되어 있습니다.
jms.receiveNoWaitLocalOnly
활성화된 경우 호출에서 수신NoWait 은 소비자의 로컬 메시지 버퍼만 확인합니다. 그렇지 않으면 원격 피어를 확인하여 사용 가능한 메시지가 없는지 확인합니다. 기본적으로 비활성화되어 있습니다.
jms.queuePrefix
세션에서 생성된 의 이름에 선택적 접두사 값이 추가되었습니다.
jms.topicPrefix
세션에서 생성된 모든 주제의 이름에 선택적 접두사 값이 추가되었습니다.
jms.closeTimeout
클라이언트가 반환하기 전에 일반 리소스 공개를 대기하는 시간(밀리초)입니다. 기본값은 60000(60초)입니다.
jms.connectTimeout
클라이언트가 연결 설정을 기다린 후 오류와 함께 반환하는 시간(밀리초)입니다. 기본값은 15000(15초)입니다.
jms.sendTimeout
클라이언트가 오류를 반환하기 전에 동기 메시지 전송이 완료될 때까지 대기하는 시간( 밀리초)입니다. 기본적으로 클라이언트는 전송이 완료될 때까지 무기한 대기합니다.
jms.requestTimeout
클라이언트가 오류를 반환하기 전에 생산자 또는 소비자(전송 제외)를 여는 것과 같은 다양한 동기 상호 작용이 완료될 때까지 대기하는 시간(밀리초)입니다. 기본적으로 클라이언트는 요청이 완료될 때까지 무기한 대기합니다.
jms.clientIDPrefix
ConnectionFactory 에서 새 Connection 을 생성할 때 클라이언트 ID 값을 생성하는 데 사용되는 선택적 접두사 값입니다. 기본값은 ID입니다..
jms.connectionIDPrefix
ConnectionFactory 에서 새 Connection 을 생성할 때 연결 ID 값을 생성하는 데 사용되는 선택적 접두사 값입니다. 이 연결 ID는 Connection 오브젝트에서 일부 정보를 로깅할 때 사용되며 구성 가능한 접두사로 인해 로그를 더 쉽게 이동할 수 있습니다. 기본값은 ID입니다..
jms.populateJMSXUserID
활성화하면 연결에서 인증된 사용자 이름을 사용하여 전송된 각 메시지에 대해 JMSXUserID 속성을 채웁니다. 기본적으로 비활성화되어 있습니다.
jms.awaitClientID
활성화된 경우 URI에 구성된 클라이언트 ID가 없는 연결은 클라이언트 ID를 프로그래밍 방식으로 설정하거나 AMQP 연결 "오픈"을 보내기 전에 설정할 수 없음을 확인합니다. 기본적으로 활성화되어 있습니다.
jms.useDaemonThread
활성화된 경우 연결은 비daemon 스레드가 아닌 executor에 데몬 스레드를 사용합니다. 기본적으로 비활성화되어 있습니다.
jms.tracing
추적 공급자의 이름입니다. 지원되는 값은 opentracingnoop 입니다. 기본값은 noop 입니다.

사전 가져오기 정책 옵션

사전 페치 정책은 각 MessageConsumer 가 원격 피어에서 가져와서 로컬 "사전 패치" 버퍼에 보관하는 메시지 수를 결정합니다.

jms.prefetchPolicy.queuePrefetch
기본값은 1000입니다.
jms.prefetchPolicy.topicPrefetch
기본값은 1000입니다.
jms.prefetchPolicy.queueBrowserPrefetch
기본값은 1000입니다.
jms.prefetchPolicy.durableTopicPrefetch
기본값은 1000입니다.
jms.prefetchPolicy.all
모든 사전 가져오기 값을 한 번에 설정하는 데 사용할 수 있습니다.

prefetch 값은 큐 또는 공유 구독에서 여러 사용자에게 메시지 배포에 영향을 줄 수 있습니다. 값이 클수록 더 큰 배치가 각 소비자에게 전송될 수 있습니다. 더 많은 라운드 로빈 배포를 수행하려면 더 낮은 값을 사용합니다.

Redelivery 정책 옵션

Redelivery policy는 클라이언트에서 재전송된 메시지를 처리하는 방법을 제어합니다.

jms.redeliveryPolicy.maxRedeliveries
재전송된 횟수에 따라 수신 메시지가 거부되는 시기를 제어합니다. 값이 0이면 메시지 재전송이 허용되지 않습니다. 값 5를 사용하면 메시지를 5 번 다시 전달할 수 있습니다. 기본값은 -1이며 이는 제한이 없음을 의미합니다.
jms.redeliveryPolicy.outcome
구성된 maxRedeliveries 값을 초과하면 메시지에 적용된 결과를 제어합니다. 지원되는 값은 ACCEPTED,REJECTED,RELEASED, MODIFIED_FAILED _UNDELIVERABLE 입니다. 기본값은 MODIFIED_FAILED_UNDELIVERABLE 입니다.

메시지 ID 정책 옵션

메시지 ID 정책은 클라이언트에서 보낸 메시지에 할당된 메시지 ID의 데이터 유형을 제어합니다.

jms.messageIDPolicy.messageIDType
기본적으로 생성된 String 값은 발신 메시지의 메시지 ID에 사용됩니다. 사용 가능한 다른 유형은 UUID,UUID_STRING, PREFIXED_UUID_STRING 입니다.

Presettle 정책 옵션

Presettle 정책은 AMQP 사전 설정 메시징 의미 체계를 사용하도록 생산자 또는 소비자 인스턴스가 구성된 시기를 제어합니다.

jms.presettlePolicy.presettleAll
활성화하면 모든 생산자 및 번역되지 않은 소비자가 미리 설정된 모드에서 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleProducers
활성화하면 모든 생산자가 사전 설정된 모드에서 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleTopicProducers
활성화된 경우 Topic 또는 TemporaryTopic 대상으로 전송하는 모든 생산자가 미리 설정된 모드에서 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleQueueProducers
활성화된 경우 Queue 또는 TemporaryQueue 대상에 전송하는 모든 생산자는 사전 설정 모드로 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleTransactedProducers
활성화된 경우 트랜잭션된 세션에서 생성된 모든 생산자는 사전 설정된 모드에서 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleConsumers
활성화하면 모든 소비자가 사전 설정된 모드에서 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleTopicConsumers
활성화된 경우 Topic 또는 TemporaryTopic 대상에서 수신하는 모든 소비자는 사전 설정 모드로 작동합니다. 기본적으로 비활성화되어 있습니다.
jms.presettlePolicy.presettleQueueConsumers
활성화된 경우 큐 또는 Temporary Queue 대상에서 수신되는 모든 소비자는 사전 설정 모드로 작동합니다. 기본적으로 비활성화되어 있습니다.

deserialization 정책 옵션

deserialization 정책은 직렬화된 Java Object 콘텐츠로 구성된 들어오는 ObjectMessage 에서 본문을 검색하는 동안 개체 스트림에서 역직렬화할 수 있는 Java 유형을 제어하는 수단을 제공합니다. 기본적으로 모든 형식은 본문의 역직렬화 시도 중에 신뢰할 수 있습니다.By default, all types are trusted during an attempt to deserialize the body. 기본 직렬화 정책은 허용 목록 및 Java 클래스 또는 패키지 이름 블랙리스트를 지정할 수 있는 URI 옵션을 제공합니다.

jms.deserializationPolicy.whiteList
blackList 로 재정의하지 않는 한 ObjectMessage 의 내용을 역직렬화할 때 허용되어야 하는 클래스 및 패키지 이름의 쉼표로 구분된 목록입니다. 이 목록의 이름은 패턴 값이 아닙니다. java.util. Map 또는 java.util 과 같이 정확한 클래스 또는 패키지 이름을 구성해야 합니다. 패키지 일치에는 하위 패키지가 포함됩니다. 기본값은 모두 허용하는 것입니다.
jms.deserializationPolicy.blackList
ObjectMessage 의 내용을 역직렬화할 때 거부해야 하는 클래스 및 패키지 이름의 쉼표로 구분된 목록입니다. 이 목록의 이름은 패턴 값이 아닙니다. java.util. Map 또는 java.util 과 같이 정확한 클래스 또는 패키지 이름을 구성해야 합니다. 패키지 일치에는 하위 패키지가 포함됩니다. 기본값은 none입니다.

5.2. TCP 옵션

일반 TCP를 사용하여 원격 서버에 연결하면 다음 옵션은 기본 소켓의 동작을 지정합니다. 이러한 옵션은 다른 구성 옵션과 함께 연결 URI에 추가됩니다.

예: 전송 옵션이 있는 연결 URI

amqp://localhost:5672?jms.clientID=foo&transport.connectTimeout=30000

TCP 전송 옵션의 전체 세트는 아래에 나열되어 있습니다.

transport.sendBufferSize
전송 버퍼 크기(바이트)입니다. 기본값은 65536 (64 KiB)입니다.
transport.receiveBufferSize
수신 버퍼 크기(바이트)입니다. 기본값은 65536 (64 KiB)입니다.
transport.trafficClass
기본값은 0입니다.
transport.connectTimeout
기본값은 60초입니다.
transport.soTimeout
기본값은 -1입니다.
transport.soLinger
기본값은 -1입니다.
transport.tcpKeepAlive
기본값은 false입니다.
transport.tcpNoDelay
활성화된 경우 지연하지 말고 TCP가 전송하는 버퍼를 처리하지 마십시오. 기본적으로 활성화되어 있습니다.
transport.useEpoll
사용 가능한 경우 NIO 계층 대신 네이티브 epoll IO 계층을 사용합니다. 이는 성능을 향상시킬 수 있습니다. 기본적으로 활성화되어 있습니다.

5.3. SSL/TLS 옵션

SSL/TLS 전송은 amqps URI 체계를 사용하여 활성화됩니다. SSL/TLS 전송은 TCP 기반 전송의 기능을 확장하므로 모든 TCP 전송 옵션은 SSL/TLS 전송 URI에서 유효합니다.

예: 간단한 SSL/TLS 연결 URI

amqps://myhost.mydomain:5671

전체 SSL/TLS 전송 옵션 세트는 다음과 같습니다.

transport.keyStoreLocation
SSL/TLS 키 저장소의 경로입니다. 설정되지 않은 경우 javax.net.ssl.keyStore 시스템 속성 값이 사용됩니다.
transport.keyStorePassword
SSL/TLS 키 저장소의 암호입니다. 설정되지 않은 경우 javax.net.ssl.keyStorePassword 시스템 속성 값이 사용됩니다.
transport.trustStoreLocation
SSL/TLS 신뢰 저장소의 경로입니다. 설정되지 않은 경우 javax.net.ssl.trustStore 시스템 속성 값이 사용됩니다.
transport.trustStorePassword
SSL/TLS 신뢰 저장소의 암호입니다. 설정되지 않은 경우 javax.net.ssl.trustStorePassword 시스템 속성 값이 사용됩니다.
transport.keyStoreType
설정되지 않은 경우 javax.net.ssl.keyStoreType 시스템 속성 값이 사용됩니다. 시스템 속성이 설정되지 않은 경우 기본값은 JKS 입니다.
transport.trustStoreType
설정되지 않은 경우 javax.net.ssl.trustStoreType 시스템 속성 값이 사용됩니다. 시스템 속성이 설정되지 않은 경우 기본값은 JKS 입니다.
transport.storeType
keyStoreTypetrustStoreType 을 모두 동일한 값으로 설정합니다. 설정되지 않은 경우 keyStoreTypetrustStoreType 의 기본값은 위에 지정된 값입니다.
transport.contextProtocol
SSLContext를 가져올 때 사용되는 프로토콜 인수입니다. 기본값은 OpenSSL을 사용하는 경우 TLS 또는 TLSv1.2 입니다.
transport.enabledCipherSuites
활성화할 암호화 제품군의 쉼표로 구분된 목록입니다. 설정되지 않으면 컨텍스트 기본 암호가 사용됩니다. 비활성화된 암호는 이 목록에서 제거됩니다.
transport.disabledCipherSuites
비활성화할 암호화 제품군의 쉼표로 구분된 목록입니다. 여기에 나열된 암호는 활성화된 암호에서 제거됩니다.
transport.enabledProtocols
활성화할 쉼표로 구분된 프로토콜 목록입니다. 설정되지 않은 경우 컨텍스트 기본 프로토콜이 사용됩니다. 비활성화된 모든 프로토콜은 이 목록에서 제거됩니다.
transport.disabledProtocols
비활성화할 쉼표로 구분된 프로토콜 목록입니다. 여기에 나열된 프로토콜은 활성화된 프로토콜 목록에서 제거됩니다. 기본값은 SSLv2Hello,SSLv3 입니다.
transport.trustAll
활성화된 경우 구성된 신뢰 저장소에 관계없이 제공된 서버 인증서를 암시적으로 신뢰합니다. 기본적으로 비활성화되어 있습니다.
transport.verifyHost
활성화된 경우 연결 호스트 이름이 제공된 서버 인증서와 일치하는지 확인합니다. 기본적으로 활성화되어 있습니다.
transport.keyAlias
클라이언트 인증서를 서버로 보내는 데 필요한 경우 키 저장소에서 키 쌍을 선택할 때 사용할 별칭입니다.
transport.useOpenSSL

활성화된 경우 SSL/TLS 연결에 기본 OpenSSL 라이브러리를 사용합니다. 기본적으로 비활성화되어 있습니다.

자세한 내용은 7.1절. “OpenSSL 지원 활성화”의 내용을 참조하십시오.

5.4. AMQP 옵션

다음 옵션은 AMQP 유선 프로토콜과 관련된 동작 측면에 적용됩니다.

amqp.idleTimeout
피어가 AMQP 프레임을 보내지 않으면 연결이 실패한 시간(밀리초)입니다. 기본값은 60000(1분)입니다.
amqp.vhost
연결할 가상 호스트입니다. SASL 및 AMQP 호스트 이름 필드를 채우는 데 사용됩니다. 기본값은 연결 URI의 기본 호스트 이름입니다.
amqp.saslLayer
활성화된 경우 연결을 설정할 때 SASL이 사용됩니다. 기본적으로 활성화되어 있습니다.
amqp.saslMechanisms
클라이언트가 서버에서 제공하고 구성된 자격 증명과 함께 사용할 수 있는 경우 클라이언트가 선택해야 하는 SASL 메커니즘 목록입니다. 지원되는 메커니즘은 EXTERNAL, SCRAM-SHA-256, SCRAM-SHA-1, CRAM-MD5, PLAIN, ANONYMOUS, Kerberos용 GSSAPI입니다. 기본값은 GSSAPI를 제외한 모든 메커니즘에서 선택을 허용하는 것입니다. 이 메커니즘을 사용하려면 여기에 명시적으로 포함되어야 합니다.
amqp.maxFrameSize
클라이언트에서 허용하는 최대 AMQP 프레임 크기(바이트)입니다. 이 값은 원격 피어에 광고됩니다. 기본값은 1048576(1MiB)입니다.
amqp.drainTimeout
소비자 드레이닝 요청이 수행될 때 클라이언트가 원격 피어의 응답을 기다리는 시간(밀리초)입니다. 할당된 시간 초과 기간에 응답이 표시되지 않으면 링크가 실패한 것으로 간주되고 연결된 소비자가 종료됩니다. 기본값은 60000(1분)입니다.
amqp.allowNonSecureRedirects
활성화하면 기존 연결이 안전하고 대체 연결이 없을 때 AMQP가 대체 호스트로 리디렉션됩니다. 예를 들어, 활성화하면 원시 TCP 연결로 SSL/TLS 연결을 리디렉션할 수 있습니다. 기본적으로 비활성화되어 있습니다.

5.5. 장애 조치 옵션

장애 조치(failover) URI는 접두사 페일오버: 로 시작하고, Geneve 내에 쉼표로 구분된 연결 URI 목록을 포함합니다. 추가 옵션은 끝에 지정됩니다. jms 로 접두사가 지정된 옵션은 괄호 외부에 전체 장애 조치 URI에 적용되며 수명 동안 Connection 오브젝트에 영향을 미칩니다.

예: 장애 조치 옵션이 있는 장애 조치 URI

failover:(amqp://host1:5672,amqp://host2:5672)?jms.clientID=foo&failover.maxReconnectAttempts=20

ScanSetting 내의 개별 브로커 세부 정보는 전송 또는 이전에 정의한 amqp. 옵션을 사용할 수 있습니다. 각 호스트가 연결된 대로 적용됩니다.

예: 연결별 전송 및 AMQP 옵션이 포함된 장애 조치 URI

failover:(amqp://host1:5672?amqp.option=value,amqp://host2:5672?transport.option=value)?jms.clientID=foo

장애 조치에 대한 모든 구성 옵션은 아래에 나열되어 있습니다.

failover.initialReconnectDelay
클라이언트가 원격 피어에 처음으로 다시 연결하기 전에 대기하는 시간(밀리초)입니다. 기본값은 0입니다. 즉 첫 번째 시도가 즉시 수행됩니다.
failover.reconnectDelay
다시 연결 시도 사이의 시간(밀리초)입니다. backoff 옵션을 활성화하지 않으면 이 값은 일정하게 유지됩니다. 기본값은 10입니다.
failover.maxReconnectDelay
다시 연결을 시도하기 전에 클라이언트가 대기하는 최대 시간입니다. 이 값은 지연이 너무 커지지 않도록 백오프 기능이 활성화된 경우에만 사용됩니다. 기본값은 30초입니다.
failover.useReconnectBackOff
활성화하면 구성된 multiplier에 따라 재연결 시도 사이의 시간이 증가합니다. 기본적으로 활성화되어 있습니다.
failover.reconnectBackOffMultiplier
다시 연결 지연 값을 늘리는 데 사용되는 multiplier입니다. 기본값은 2.0입니다.
failover.maxReconnectAttempts
클라이언트에 실패한 연결을 보고하기 전에 허용되는 재연결 시도 횟수입니다. 기본값은 -1이며 이는 제한이 없음을 의미합니다.
failover.startupMaxReconnectAttempts
이전에 원격 피어에 연결되지 않은 클라이언트의 경우 이 옵션은 연결을 실패한 것으로 보고하기 전에 연결 시도 횟수를 제어합니다. 설정되지 않으면 maxReconnectAttempts 의 값이 사용됩니다.
failover.warnAfterReconnectAttempts
경고가 기록될 때까지 실패한 재연결 시도 횟수입니다. 기본값은 10입니다.
failover.randomize
활성화된 경우 장애 조치 URI 세트가 중 하나에 연결하기 전에 임의로 축소됩니다. 이를 통해 클라이언트 연결을 여러 원격 피어에 보다 균등하게 분산할 수 있습니다. 기본적으로 비활성화되어 있습니다.
failover.amqpOpenServerListAction
서버의 연결 "오픈" 프레임이 클라이언트에 장애 조치 호스트 목록을 제공할 때 장애 조치 전송이 작동하는 방식을 제어합니다. 유효한 값은 REPLACE,ADD 또는 IGNORE 입니다. REPLACE 가 구성된 경우 현재 서버에 대한 장애 조치 URI 이외의 모든 장애 조치 URI가 서버에서 제공하는 항목으로 교체됩니다. ADD 가 구성된 경우 서버에서 제공하는 URI가 중복 제거와 함께 기존 페일오버 URI 세트에 추가됩니다. IGNORE 가 구성되면 서버의 모든 업데이트가 무시되고 사용 중인 장애 조치 URI 세트가 변경되지 않습니다. 기본값은 REPLACE 입니다.

또한 장애 조치 URI는 개별 중첩된 브로커 URI에 적용되는 AMQP 및 전송 옵션 값을 지정하는 수단으로 중첩된 옵션 정의도 지원합니다. 이는 동일한 전송amqp를 사용하여 수행됩니다. 장애 조치(failover) 브로커 URI가 아닌 경우 URI 옵션은 이전에 설명되었지만 failover.nested 접두사가 붙습니다.. 예를 들어 amqp.vhost 옵션에 동일한 값을 적용하려면 연결된 모든 브로커에 다음과 같은 URI가 있을 수 있습니다.

예: 공유 전송 및 AMQP 옵션을 사용한 장애 조치 URI

failover:(amqp://host1:5672,amqp://host2:5672)?jms.clientID=foo&failover.nested.amqp.vhost=myhost

5.6. 검색 옵션

클라이언트에는 연결할 브로커 URI가 초기 URI에 제공되지 않고 검색 에이전트와 상호 작용하여 검색 URI가 표시되는 사용자 지정 장애 조치 계층을 제공하는 선택적 검색 모듈이 있습니다. 현재 두 개의 검색 에이전트 구현이 있습니다. 파일에서 URI를 로드하는 파일 조사기 및 수신 대기 클라이언트를 위해 브로커 주소를 브로드캐스트하도록 구성된 ActiveMQ 5.x 브로커와 함께 작동하는 멀티 캐스트 리스너입니다.

discovery를 사용할 때 일반적인 장애 조치 관련 옵션 세트는 기본 접두사가 failover. 에서 discovery 로 변경되었으며 검색된 모든 브로커 URI에 공통 URI 옵션을 제공하는 데 사용되는 중첩된 접두사와 동일합니다. 예를 들어 에이전트 URI 세부 정보가 없으면 일반 검색 URI가 다음과 같을 수 있습니다.

예: 검색 URI

discovery:(<agent-uri>)?discovery.maxReconnectAttempts=20&discovery.discovered.jms.clientID=foo

파일 감시기 검색 에이전트를 사용하려면 다음과 같은 에이전트 URI를 생성합니다.

예: 파일 감시기를 사용하는 검색 URI

discovery:(file:///path/to/monitored-file?updateInterval=60000)

파일 감시자 검색 에이전트의 URI 옵션은 아래에 나열되어 있습니다.

updateInterval
파일 변경 사항을 확인하는 사이의 시간(밀리초)입니다. 기본값은 30000(30초)입니다.

ActiveMQ 5.x 브로커와 함께 멀티 캐스트 검색 에이전트를 사용하려면 다음과 같은 에이전트 URI를 생성합니다.

예: 멀티 캐스트 리스너 에이전트를 사용하는 검색 URI

discovery:(multicast://default?group=default)

위의 멀티캐스트 에이전트 URI에서 호스트로 default 를 사용하는 것은 에이전트가 기본값 239.255.2.3:6155 로 대체하는 특수 값입니다. 이를 변경하여 멀티 캐스트 구성과 함께 사용 중인 실제 IP 주소 및 포트를 지정할 수 있습니다.

멀티 캐스트 검색 에이전트의 URI 옵션은 아래에 나열되어 있습니다.

group
업데이트를 수신 대기하는 데 사용되는 멀티 캐스트 그룹입니다. 기본값은 기본값 입니다.

6장. 예

이 장에서는 예제 프로그램을 통해 AMQ JMS를 사용하는 방법을 보여줍니다.

자세한 내용은 AMQ JMS 예제 제품군 및 Cryostat JMS 예제 를 참조하십시오.

6.1. JNDI 컨텍스트 구성

JMS를 사용하는 애플리케이션은 일반적으로 JNDI를 사용하여 애플리케이션에서 사용하는 ConnectionFactoryDestination 오브젝트를 가져옵니다. 이렇게 하면 구성이 프로그램과 별도로 유지되고 특정 클라이언트 구현과 격리됩니다.

이러한 예제를 사용하려면 이전에 설명한 대로 JNDI 컨텍스트를 구성하려면 jndi.properties 라는 파일을 classpath에 배치해야 합니다.

jndi.properties 파일의 내용은 클라이언트의 InitialContextFactory 구현을 사용해야 함을 설정하는 아래 표시된 내용과 일치해야 하며, 로컬 서버에 연결하도록 ConnectionFactory 를 구성하고, 이름이 queue 인 대상 큐를 정의합니다.

# Configure the InitialContextFactory class to use
java.naming.factory.initial = org.apache.qpid.jms.jndi.JmsInitialContextFactory

# Configure the ConnectionFactory
connectionfactory.myFactoryLookup = amqp://localhost:5672

# Configure the destination
queue.myDestinationLookup = queue

6.2. 메시지 전송

이 예제에서는 먼저 JNDI 컨텍스트 를 생성하고 이를 사용하여 ConnectionFactoryDestination 을 조회하고, 팩토리를 사용하여 연결을 생성 및 시작한 다음 세션을 생성합니다. 그런 다음 MessageProducer대상에 생성되고 메시지를 사용하여 전송됩니다. 그러면 연결이 닫히고 프로그램이 종료됩니다.

Sender 예제의 실행 가능한 변형은 < source-dir>/qpid-jms-examples 디렉터리에 있으며 이전에 3장. 시작하기 에서 다루는 Hello World 예제에 있습니다.

예: 메시지 전송

package org.jboss.amq.example;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Sender {
  public static void main(String[] args) throws Exception {
    try {
      Context context = new InitialContext(); 1

      ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
      Destination destination = (Destination) context.lookup("myDestinationLookup"); 2

      Connection connection = factory.createConnection("<username>", "<password>");
      connection.setExceptionListener(new MyExceptionListener());
      connection.start(); 3

      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 4

      MessageProducer messageProducer = session.createProducer(destination); 5

      TextMessage message = session.createTextMessage("Message Text!"); 6
      messageProducer.send(message, DeliveryMode.NON_PERSISTENT,
                           Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE); 7

      connection.close(); 8
    } catch (Exception exp) {
      System.out.println("Caught exception, exiting.");
      exp.printStackTrace(System.out);
      System.exit(1);
    }
  }

  private static class MyExceptionListener implements ExceptionListener {
    @Override
    public void onException(JMSException exception) {
      System.out.println("Connection ExceptionListener fired, exiting.");
      exception.printStackTrace(System.out);
      System.exit(1);
    }
  }
}

1
JNDI 컨텍스트 를 생성하여 ConnectionFactoryDestination 오브젝트를 조회합니다. 설정은 앞에서 설명한 대로 jndi.properties 파일에서 선택합니다.
2
ConnectionFactory 및 Destination 오브젝트는 조회 이름을 사용하여 JNDI 컨텍스트에서 검색됩니다.
3
팩토리는 연결을 생성하는 데 사용되며, 그러면 ExceptionListener 가 등록되고 시작됩니다. 연결을 생성할 때 제공되는 인증 정보는 일반적으로 적절한 외부 구성 소스에서 가져와 애플리케이션 자체와 별도로 유지되며 독립적으로 업데이트할 수 있습니다.
4
비전송된 자동 확인 세션이 연결 에서 생성됩니다.
5
MessageProducer 은 메시지를 대상에 전송하도록 생성됩니다.
6
textMessage 는 지정된 콘텐츠를 사용하여 생성됩니다.
7
textMessage 가 전송됩니다. 기본 우선 순위 및 만료가 없는 비영구적으로 전송됩니다.
8
연결이 닫힙니다. SessionMessageProducer 은 암시적으로 닫힙니다.

이는 예제일 뿐입니다. 실제 애플리케이션은 일반적으로 수명이 긴 MessageProducer를 사용하고 시간이 지남에 따라 많은 메시지를 사용합니다. 일반적으로 메시지당 연결,세션, MessageProducer 를 여는 것은 효율적이지 않습니다.

6.3. 메시지 수신

이 예제는 JNDI 컨텍스트를 생성하고, 이를 사용하여 ConnectionFactoryDestination 을 찾고, 팩토리를 사용하여 연결을 생성 및 시작한 다음 세션을 생성합니다. 그런 다음 대상에 대해 MessageConsumer 가 생성되고 이를 사용하여 메시지를 수신하며 해당 콘텐츠가 콘솔에 출력됩니다. 그러면 연결이 닫히고 프로그램이 종료됩니다. 전송 예에서 와 동일한 JNDI 구성이 사용됩니다.

수신기 예제의 실행 가능한 변형은 이전에 3장. 시작하기 에서 다루는 Hello World 예제와 함께 클라이언트 배포의 예제 디렉터리에 포함되어 있습니다.

예: 메시지 수신

package org.jboss.amq.example;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Receiver {
  public static void main(String[] args) throws Exception {
    try {
      Context context = new InitialContext(); 1

      ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
      Destination destination = (Destination) context.lookup("myDestinationLookup"); 2

      Connection connection = factory.createConnection("<username>", "<password>");
      connection.setExceptionListener(new MyExceptionListener());
      connection.start(); 3

      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 4

      MessageConsumer messageConsumer = session.createConsumer(destination); 5

      Message message = messageConsumer.receive(5000); 6

      if (message == null) { 7
        System.out.println("A message was not received within given time.");
      } else {
        System.out.println("Received message: " + ((TextMessage) message).getText());
      }

      connection.close(); 8
    } catch (Exception exp) {
      System.out.println("Caught exception, exiting.");
      exp.printStackTrace(System.out);
      System.exit(1);
    }
 }

  private static class MyExceptionListener implements ExceptionListener {
    @Override
    public void onException(JMSException exception) {
      System.out.println("Connection ExceptionListener fired, exiting.");
      exception.printStackTrace(System.out);
      System.exit(1);
    }
  }
}

1
JNDI 컨텍스트 를 생성하여 ConnectionFactoryDestination 오브젝트를 조회합니다. 설정은 앞에서 설명한 대로 jndi.properties 파일에서 선택합니다.
2
ConnectionFactoryDestination 오브젝트는 조회 이름을 사용하여 JNDI 컨텍스트에서 검색됩니다.
3
팩토리는 연결을 생성하는 데 사용되며, 그러면 ExceptionListener 가 등록되고 시작됩니다. 연결을 생성할 때 제공되는 인증 정보는 일반적으로 적절한 외부 구성 소스에서 가져와 애플리케이션 자체와 별도로 유지되며 독립적으로 업데이트할 수 있습니다.
4
비전송된 자동 확인 세션이 연결 에서 생성됩니다.
5
MessageConsumer대상 에서 메시지를 수신하도록 생성됩니다.
6
메시지를 수신하라는 호출은 5초의 시간 초과로 수행됩니다.
7
결과가 확인되고 메시지가 수신되면 해당 콘텐츠가 출력되거나 메시지가 수신되지 않았음을 알 수 있습니다. 결과는 Sender 가 보낸 것을 알고 있기 때문에 텍스트 메시지로 명시적으로 캐스팅됩니다.
8
연결이 닫힙니다. 세션MessageConsumer 는 암시적으로 닫힙니다.

이는 예제일 뿐입니다. 실제 애플리케이션은 일반적으로 긴 MessageConsumer 를 사용하고 시간이 지남에 따라 많은 메시지를 수신합니다. 각 메시지에 대한 연결,세션MessageConsumer 를 열고 종료하는 것은 일반적으로 효율적이지 않습니다.

7장. 보안

AMQ JMS에는 애플리케이션 요구에 따라 활용할 수 있는 다양한 보안 관련 구성 옵션이 있습니다.

애플리케이션 내에서 연결을 생성할 때 사용자 이름 및 암호와 같은 기본 사용자 인증 정보는 ConnectionFactory 에 직접 전달해야 합니다. 그러나 no-argument 팩토리 방법을 사용하는 경우 연결 URI에 사용자 인증 정보를 제공할 수도 있습니다. 자세한 내용은 5.1절. “JMS 옵션” 섹션을 참조하십시오.

또 다른 일반적인 보안 고려 사항은 SSL/TLS 사용입니다. amqps URI 스키마가 연결 URI 에 지정되고 동작을 구성하는 데 사용할 수 있는 다양한 옵션을 사용할 때 클라이언트는 SSL/TLS 전송을 통해 서버에 연결합니다. 자세한 내용은 5.3절. “SSL/TLS 옵션” 섹션을 참조하십시오.

이전 항목과 요약하면 클라이언트가 서버에서 제공할 수 있는 모든 지원을 선택하는 대신 특정 SASL 메커니즘만 사용할 수 있도록 하는 것이 바람직할 수 있습니다. 자세한 내용은 5.4절. “AMQP 옵션” 섹션을 참조하십시오.

수신된 ObjectMessage 에서 getObject() 를 호출하는 애플리케이션은 deserialization 중에 생성된 유형을 제한하려고 할 수 있습니다. AMQP 유형 시스템을 사용하여 구성된 메시지 본문은 ObjectInputStream 메커니즘을 사용하지 않으므로 이러한 예방 조치가 필요하지 않습니다. 자세한 내용은 “deserialization 정책 옵션” 섹션을 참조하십시오.

7.1. OpenSSL 지원 활성화

성능 향상을 위해 기본 OpenSSL 구현을 사용하도록 SSL/TLS 연결을 구성할 수 있습니다. OpenSSL을 사용하려면 transport.useOpenSSL 옵션을 활성화해야 하며 classpath에서 OpenSSL 지원 라이브러리를 사용할 수 있어야 합니다.

Red Hat Enterprise Linux에서 시스템에서 설치한 OpenSSL 라이브러리를 사용하려면 opensslapr RPM 패키지를 설치하고 POM 파일에 다음 종속성을 추가합니다.

예: 기본 OpenSSL 지원 추가

<dependency>
  <groupId>io.netty</groupId>
  <artifactId>netty-tcnative</artifactId>
  <version>2.0.46.Final-redhat-00001</version>
  <classifier>linux-x86_64-fedora</classifier>
</dependency>

OpenSSL 라이브러리 구현 목록은 Netty 프로젝트에서 사용할 수 있습니다.

7.2. Kerberos를 사용하여 인증

적절하게 구성된 서버와 함께 사용할 때 Kerberos를 사용하여 인증하도록 클라이언트를 구성할 수 있습니다. Kerberos를 활성화하려면 다음 단계를 사용합니다.

  1. amqp.saslMechanisms URI 옵션을 사용하여 SASL 인증에 GSSAPI 메커니즘을 사용하도록 클라이언트를 구성합니다.

    amqp://myhost:5672?amqp.saslMechanisms=GSSAPI
    failover:(amqp://myhost:5672?amqp.saslMechanisms=GSSAPI)
  2. Kerberos LoginModule 에 대한 적절한 구성이 포함된 java.security.auth.login.config 시스템 속성을 JAAS 로그인 구성 파일의 경로로 설정합니다.

    -Djava.security.auth.login.config=<login-config-file>

    로그인 구성 파일은 다음 예와 같을 수 있습니다.

    amqp-jms-client {
        com.sun.security.auth.module.Krb5LoginModule required
        useTicketCache=true;
    };

사용되는 정확한 구성은 연결에 사용할 인증 정보를 설정하는 방법과 사용 중인 특정 LoginModule 에 따라 달라집니다. Oracle Krb5LoginModule 에 대한 자세한 내용은 Oracle Krb5LoginModule 클래스 참조를 참조하십시오. IBM Java 8 Krb5LoginModule 에 대한 자세한 내용은 IBM Krb5LoginModule 클래스 참조를 참조하십시오.

보안 주체 지정 및 기존 티켓 캐시 또는 keytab 사용 여부 등 Kerberos 프로세스에 사용할 자격 증명을 설정하도록 LoginModule 을 구성할 수 있습니다. 그러나 LoginModule 구성이 필요한 모든 자격 증명을 설정하는 수단을 제공하지 않으면 ConnectionFactory 를 사용하거나 URI 옵션을 통해 이전에 구성된 연결을 생성할 때 클라이언트 연결 오브젝트에서 사용자 이름 및 암호 값을 요청하고 전달할 수 있습니다.

Kerberos는 인증 목적으로만 지원됩니다. 암호화에 SSL/TLS 연결을 사용합니다.

다음 연결 URI 옵션을 사용하여 Kerberos 인증 프로세스에 영향을 줄 수 있습니다.

sasl.options.configScope
인증에 사용되는 로그인 구성 항목의 이름입니다. 기본값은 amqp-jms-client 입니다.
sasl.options.protocol
GSSAPI SASL 프로세스 중에 사용되는 프로토콜 값입니다. 기본값은 amqp 입니다.
sasl.options.serverName
GSSAPI SASL 프로세스 중에 사용되는 serverName 값입니다. 기본값은 연결 URI의 서버 호스트 이름입니다.

amqp.transport와 유사합니다. 이전에 설명된 옵션은 호스트별로 또는 장애 조치 URI의 모든 호스트 중첩 옵션으로 지정해야 합니다.

8장. 메시지 전달

8.1. 승인되지 않은 전송 처리

메시징 시스템은 메시지 승인을 사용하여 메시지 전송의 목적을 실제로 달성했는지를 추적합니다.

메시지가 전송되면 메시지가 전송된 후 및 승인되기 전 까지의 시간이 있습니다(메시지는 "전달 중"). 해당 시간 동안 네트워크 연결이 손실되면 메시지 전달 상태를 알 수 없으며 완료를 보장하기 위해 애플리케이션 코드에서 전송에 특별한 처리가 필요할 수 있습니다.

아래 섹션에서는 연결이 실패할 때 메시지 전달 조건을 설명합니다.

승인되지 않은 생산자와 함께 번역되지 않은 생산자

메시지가 이동 중이면 다시 연결한 후 전송 시간 초과가 설정되지 않고 경과되지 않은 경우 다시 전송됩니다.

사용자 작업이 필요하지 않습니다.

커밋되지 않은 트랜잭션이 있는 트랜잭션 생성

메시지가 이동 중이면 다시 연결한 후 전송됩니다. 새 트랜잭션의 첫 번째 전송인 경우 다시 연결한 후 전송이 정상적으로 계속됩니다. 이전에 트랜잭션에서 전송하는 경우 트랜잭션이 실패한 것으로 간주되고 후속 커밋 작업에서 TransactionRolledBackException 이 발생합니다.

전송을 위해 사용자는 실패한 트랜잭션에 속하는 메시지를 다시 보내야 합니다.

보류 중인 커밋을 사용하여 생산자를 트랜잭션

커밋이 해제되면 트랜잭션이 실패한 것으로 간주되고 후속 커밋 작업에서 TransactionRolledBackException 이 발생합니다.

전송을 위해 사용자는 실패한 트랜잭션에 속하는 메시지를 다시 보내야 합니다.

승인되지 않은 배송을 통해 번역되지 않은 소비자

메시지가 수신되었지만 아직 승인되지 않은 경우 메시지를 확인하면 오류가 발생하지 않지만 클라이언트가 작업을 수행하지 않습니다.

수신된 메시지가 승인되지 않기 때문에 생산자가 다시 보낼 수 있습니다. 중복을 방지하려면 사용자가 메시지 ID로 중복 메시지를 필터링해야 합니다.

커밋되지 않은 트랜잭션이 있는 트랜잭션

활성 트랜잭션이 아직 커밋되지 않은 경우 실패한 것으로 간주되고 보류 중인 승인이 삭제됩니다. 후속 커밋 작업은 TransactionRolledBackException 을 throw합니다.

생산자는 트랜잭션에 속하는 메시지를 다시 보낼 수 있습니다. 중복을 방지하려면 사용자가 메시지 ID로 중복 메시지를 필터링해야 합니다.

보류 중인 커밋으로 소비자를 트랜잭션

커밋이 진행 중이면 트랜잭션이 실패한 것으로 간주됩니다. 후속 커밋 작업은 TransactionRolledBackException 을 throw합니다.

생산자는 트랜잭션에 속하는 메시지를 다시 보낼 수 있습니다. 중복을 방지하려면 사용자가 메시지 ID로 중복 메시지를 필터링해야 합니다.

8.2. 확장 세션 승인 모드

클라이언트는 JMS 사양에 정의된 두 가지 추가 세션 승인 모드를 지원합니다.

개별 승인

이 모드에서 세션이 CLIENT_ACKNOWLEDGE 모드에 있을 때 사용되는 Message.acknowledge() 메서드를 사용하여 애플리케이션에서 메시지를 개별적으로 승인해야 합니다. CLIENT_ACKNOWLEDGE 모드와 달리 대상 메시지만 승인됩니다. 다른 모든 전송 메시지는 승인되지 않은 상태로 유지됩니다. 이 모드를 활성화하는 데 사용되는 정수 값은 101입니다.

connection.createSession(false, 101);

승인 없음

이 모드에서는 클라이언트에 디스패치되기 전에 서버에서 메시지가 수락되고 클라이언트에서 승인을 수행하지 않습니다. 클라이언트는 이 모드를 활성화하기 위해 두 개의 정수 값, 100 및 257을 지원합니다.

connection.createSession(false, 100);

9장. 로깅

9.1. 로깅 구성

클라이언트는 SLF4J API를 사용하여 사용자가 필요에 따라 특정 로깅 구현을 선택할 수 있습니다. 예를 들어, 사용자는 slf4j-log4j 바인딩을 제공하여 Log4J 구현을 선택할 수 있습니다. SLF4J에 대한 자세한 내용은 웹 사이트에서 확인할 수 있습니다.

클라이언트는 org.apache.qpid.jms 계층 구조에 있는 Logger 이름을 사용하여 필요에 따라 로깅 구현을 구성할 수 있습니다.

9.2. 프로토콜 로깅 활성화

디버깅할 때 Cryostat Proton AMQP 1.0 라이브러리에서 추가 프로토콜 추적 로깅을 활성화하는 것이 유용한 경우가 있습니다. 이를 수행하는 방법은 다음 두 가지가 있습니다.

  • 환경 변수(Java 시스템 속성이 아님) PN_TRACE_FRM1 로 설정합니다. 변수가 1 로 설정되면 Proton은 프레임 로깅을 콘솔에 내보냅니다.
  • 연결 URIamqp.traceFrames=true 옵션을 추가하고 로그 수준 TRACEorg.apache.qpid.jms.provider.amqp.FRAMES 로거를 구성합니다. 이렇게 하면 Proton에 프로토콜 추적기가 추가되고 로그에 출력이 포함됩니다.

입력 및 출력 바이트의 하위 수준 추적을 내보내도록 클라이언트를 구성할 수도 있습니다. 이를 활성화하려면 연결 URItransport.traceBytes=true 옵션을 추가하고 org.apache.qpid.jms.transports.netty.NettyTcpTransport 로거를 로그 수준 DEBUG 로 구성합니다.

10장. 분산 추적

클라이언트는 OpenTracing 표준의 Jaeger 구현을 기반으로 분산 추적을 제공합니다.

10.1. 분산 추적 활성화

다음 단계를 사용하여 애플리케이션에서 추적을 활성화합니다.

프로세스

  1. POM 파일에 Jaeger 클라이언트 종속성을 추가합니다.

    <dependency>
      <groupId>io.jaegertracing</groupId>
      <artifactId>jaeger-client</artifactId>
      <version>${jaeger-version}</version>
    </dependency>

    ${Jaeger-version} 은 1.0.0 이상이어야 합니다.

  2. 연결 URI에 jms.tracing 옵션을 추가합니다. 값을 opentracing 으로 설정합니다.

    예: 추적이 활성화된 연결 URI

    amqps://example.net?jms.tracing=opentracing

  3. 글로벌 추적기를 등록합니다.

    예: 글로벌 추적기 등록

    import io.jaegertracing.Configuration;
    import io.opentracing.Tracer;
    import io.opentracing.util.GlobalTracer;
    
    public class Example {
        public static void main(String[] args) {
            Tracer tracer = Configuration.fromEnv("<service-name>").getTracer();
            GlobalTracer.registerIfAbsent(tracer);
    
            // ...
        }
    }

  4. 추적을 위해 환경을 구성합니다.

    예: 설정 추적

    $ export JAEGER_SAMPLER_TYPE=const
    $ export JAEGER_SAMPLER_PARAM=1
    $ java -jar example.jar net.example.Example

    여기에 표시된 구성은 설명을 위한 것입니다. Jaeger 구성에 대한 자세한 내용은 환경 및 Jaeger 샘플링 을 통한 구성 을 참조하십시오.

애플리케이션 캡처 추적을 보려면 Jaeger 시작하기 를 사용하여 Jaeger 인프라 및 콘솔을 실행합니다.

11장. 상호 운용성

이 장에서는 다른 AMQ 구성 요소와 함께 AMQ JMS를 사용하는 방법에 대해 설명합니다. AMQ 구성 요소의 호환성 개요는 제품 소개 를 참조하십시오.

11.1. 다른 AMQP 클라이언트와 상호 작용

AMQP 메시지는 AMQP 유형 시스템을 사용하여 구성됩니다. 이러한 공통 형식을 갖는 것은 다른 언어의 AMQP 클라이언트가 서로 상호 운용할 수 있는 이유 중 하나입니다. 이 섹션은 다른 AMQP 클라이언트와 함께 클라이언트 사용을 지원하기 위해 사용되는 다양한 JMS Message 유형과 관련하여 클라이언트에서 전송 및 수신한 AMQP 페이로드 관련 동작을 문서화하는 역할을 합니다.

11.1.1. 메시지 전송

이 섹션에서는 다양한 JMS Message 유형을 사용할 때 클라이언트가 전송한 다양한 페이로드를 문서화하여 다른 클라이언트를 사용하여 수신할 수 있도록 지원합니다.

11.1.1.1. 메시지 유형

JMS 메시지 유형전송된 AMQP 메시지의 설명

textMessage

textMessage는 본문 텍스트의 utf8 인코딩 문자열 을 포함하는 amqp-value body 섹션을 사용하거나 본문 텍스트가 설정되지 않은 경우 null 로 전송됩니다. "x-opt-jms-msg-type"의 기호 키가 있는 메시지 주석은 바이트 값 5로 설정됩니다.

BytesMessage

CryostatsMessage는 properties 섹션의 content-type 필드가 기호"application/octet-stream" 으로 설정되어 있는 data body 섹션을 사용하여 전송됩니다. "x-opt-jms-msg-type"의 기호 키가 있는 메시지 주석은 바이트 값 3으로 설정됩니다.

MapMessage

MapMessage 본문은 단일 값을 포함하는 amqp-value body 섹션을 사용하여 전송됩니다. MapMessage 본문의 모든 byte[] 값은 맵의 바이너리 항목으로 인코딩됩니다. "x-opt-jms-msg-type" 기호 키가 있는 메시지 주석은 바이트 값 2로 설정됩니다.

StreamMessage

StreamMessage는 StreamMessage 본문의 항목이 포함된 amqp-sequence 본문 섹션을 사용하여 전송됩니다. StreamMessage 본문의 모든 byte[] 항목은 시퀀스의 바이너리 항목으로 인코딩됩니다. "x-opt-jms-msg-type"의 기호 키가 있는 메시지 주석은 바이트 값 4로 설정됩니다.

ObjectMessage

ObjectMessage는 ObjectOutputStream을 사용하여 ObjectMessage 본문을 직렬화하는 바이트를 포함하는 데이터 본문 섹션을 사용하여 전송됩니다. properties 섹션 content-type 필드가 기호"application/x-java-serialized-object" 로 설정되어 있습니다. "x-opt-jms-msg-type" 기호 키가 있는 메시지 주석은 바이트 값 1로 설정됩니다.

메시지

일반 JMS 메시지에는 본문이 없으며 null 이 포함된 amqp-value body 섹션으로 전송됩니다. "x-opt-jms-msg-type" 기호 키가 있는 메시지 주석은 바이트 값 0으로 설정됩니다.

11.1.1.2. 메시지 속성

JMS 메시지는 다양한 Java 유형의 애플리케이션 속성을 설정할 수 있도록 지원합니다. 이 섹션에서는 전송된 메시지의 application-properties 섹션에 있는 AMQP 형식 값에 대한 이러한 속성 유형의 매핑을 표시하는 역할을 합니다. JMS 및 AMQP는 모두 속성 이름에 문자열 키를 사용합니다.

JMS 속성 유형AMQP 애플리케이션 속성 유형

boolean

boolean

byte

byte

short

short

int

int

long

long

플로트

플로트

double

double

문자열

문자열 또는 null

11.1.2. 메시지 수신

이 섹션은 클라이언트가 수신한 다양한 페이로드를 문서화하는 역할을 하며 JMS 클라이언트에서 수신하기 위해 다른 클라이언트를 사용하여 메시지를 보내는 데 도움이 되도록 다양한 JMS 메시지 유형에 매핑됩니다.

11.1.2.1. 메시지 유형

다음 표에 설명된 매핑에 따라 "x-opt-jms-msg-type" message-annotation이 수신된 AMQP 메시지에 있는 경우 해당 값은 다음 표에 설명된 매핑에 따라 이를 나타내는 데 사용되는 JMS 메시지 유형을 결정하는 데 사용됩니다. 이는 JMS 클라이언트에서 전송한 메시지에 대해 설명된 매핑의 역방향 프로세스를 반영합니다.

AMQP "x-opt-jms-msg-type" message-annotation value (type)JMS 메시지 유형

0 (byte)

메시지

1 (바이트)

ObjectMessage

2 (바이트)

MapMessage

3 (바이트)

BytesMessage

4 (바이트)

StreamMessage

5 (바이트)

textMessage

"x-opt-jms-msg-type" message-annotation이 없으면 아래 표에서 메시지를 JMS 메시지 유형에 매핑하는 방법을 자세히 설명합니다. StreamMessageMapMessage 유형은 주석이 달린 메시지에만 할당됩니다.

"x-opt-jms-msg-type" 주석이 없는 Received AMQP 메시지에 대한 설명JMS 메시지 유형
  • 문자열 또는 null 을 포함하는 amqp-value body 섹션.
  • properties 섹션 content-type 필드가 "text/plain", "application/xml" 또는 "application/json" 과 같은 일반적인 텍스트 미디어 유형을 나타내는 기호 값으로 설정된 데이터 본문 섹션.

textMessage

  • 바이너리 를 포함하는 amqp-value body 섹션.
  • properties 섹션의 content-type 필드가 설정되지 않은 데이터 본문 섹션은 기호"application/octet-stream" 으로 설정하거나 다른 메시지 유형과 연결되지 않은 값으로 설정합니다.

BytesMessage

ObjectMessage

11.1.2.2. 메시지 속성

이 섹션에서는 수신된 AMQP 메시지의 application-properties 섹션에 있는 값 매핑을 JMS Message에 사용된 Java 유형에 표시하는 역할을 합니다.

AMQP 애플리케이션 속성 유형JMS 속성 유형

boolean

boolean

byte

byte

short

short

int

int

long

long

플로트

플로트

double

double

string

문자열

null

문자열

11.2. AMQ Broker에 연결

AMQ Broker는 AMQP 1.0 클라이언트와 상호 작동하도록 설계되었습니다. 브로커가 AMQP 메시징에 대해 구성되었는지 확인하려면 다음을 확인하십시오.

  • 네트워크 방화벽의 포트 5672가 열려 있습니다.
  • AMQ Broker AMQP 어셉터가 활성화되어 있습니다. Default acceptor 설정을 참조하십시오.
  • 필요한 주소는 브로커에 구성되어 있습니다. 주소, 큐 및 주제를 참조하십시오.
  • 브로커는 클라이언트의 액세스를 허용하도록 구성되며 클라이언트는 필요한 인증 정보를 전송하도록 구성됩니다. Broker Security 를 참조하십시오.

부록 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. 브라우저를 열고 Red Hat Customer Portal 제품 다운로드 페이지에 access.redhat.com/downloads.
  2. INTEGRATION 및 AUTOMATION 카테고리에서 Red Hat AMQ 항목을 찾습니다.
  3. 원하는 AMQ 제품을 선택합니다. 소프트웨어 다운로드 페이지가 열립니다.
  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 파일의 repository 요소에 새 항목을 추가합니다.

예: 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

파일:/home/alice/maven-repository

Windows

C:\repos\red-hat

file:C:\repos\red-hat

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

AMQ JMS 예제에는 queue 이라는 큐가 있는 실행 중인 메시지 브로커가 필요합니다. 아래 절차를 사용하여 브로커를 설치 및 시작하고 큐를 정의합니다.

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 라는 큐를 생성합니다.

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

일련의 예 또는 아니오 질문에 대답하라는 메시지가 표시됩니다. 모두 N 에 대한 답변입니다.

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

C.4. 브로커 중지

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

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

2023-09-26에 최종 업데이트된 문서

법적 공지

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.