본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

AMQP

원문 보기 위키 갱신

AMQP (AMQP 컴포넌트)

이 문서는 Apache Camel의 camel-amqp 컴포넌트 문서를 한국어로 옮긴 거예요. AMQP 컴포넌트는 Qpid 프로젝트의 JMS Client API를 사용해서 AMQP 1.0 프로토콜을 지원하고, 프로듀서와 컨슈머를 모두 지원해요.

출처: 문서

본문

Maven을 쓴다면 이 컴포넌트를 쓰기 위해 pom.xml에 다음 의존성을 추가해야 해요:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-amqp</artifactId>
    <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
</dependency>

URI format

Java 전용: URI 형식 문법

amqp:[queue:|topic:]destinationName[?options]

옵션 구성하기

Camel 컴포넌트는 서로 다른 두 단계에서 설정돼요:

  • 컴포넌트(component) 단계
  • 엔드포인트(endpoint) 단계

컴포넌트 옵션 구성하기

컴포넌트 단계에서는 엔드포인트들이 물려받는 일반적이고 공통된 설정을 해요. 가장 상위의 설정 단계죠.

예컨대 컴포넌트에는 보안 설정, 인증에 쓰는 credentials, 네트워크 연결을 위한 URL 같은 것들이 있을 수 있어요.

컴포넌트마다 옵션이 몇 개뿐인 경우도 있고 많은 경우도 있어요. 컴포넌트는 보통 자주 쓰는 기본값이 미리 준비되어 있어서, 몇 개의 옵션만 설정하거나 아예 하나도 건드리지 않아도 되는 경우가 많아요.

컴포넌트를 구성하는 방법은 이렇게 있어요:

  • Component DSL
  • 설정 파일(application.properties, *.yaml 파일 등)
  • Java 코드에 직접

엔드포인트 옵션 구성하기

엔드포인트는 옵션이 많은 편이라 설정에 시간을 더 쓰게 돼요. 이 옵션들은 엔드포인트가 하고 싶은 동작을 맞춤 설정하는 데 도움을 줘요. 옵션은 엔드포인트가 소비자(from)로 쓰이는지, 프로듀서(to)로 쓰이는지, 둘 다인지에 따라 분류되기도 해요.

엔드포인트 설정은 대부분 엔드포인트 URI의 _path_와 query 파라미터로 직접 이뤄져요. Java에서 엔드포인트와 데이터 포맷을 _타입 세이프_하게 설정하고 싶다면 Endpoint DSL과 DataFormat DSL을 쓸 수도 있어요.

옵션을 설정할 때 좋은 습관 하나는 Property Placeholders를 활용하는 거예요.

프로퍼티 플레이스홀더는 이런 장점들이 있어요:

  • URL, 포트 번호, 민감한 정보 같은 설정을 코드에 하드코딩하는 걸 막아줘요.
  • 설정을 코드 밖으로 꺼내서 관리할 수 있게 해줘요.
  • 코드가 더 유연해지고 재사용하기 좋아져요.

지금부터 두 절에 걸쳐 모든 옵션을 나열해요. 먼저 컴포넌트 옵션이고, 그다음이 엔드포인트 옵션이에요.

Component Options

AMQP 컴포넌트는 아래 나열한 옵션들을 지원해요.

Name Description Default Type
brokerUrl (common) 브로커에 접속할 원격 URL이에요. 이 URL은 커넥션 팩토리를 구성할 때 쓰이고, 브로커(ActiveMQ 같은)마다 형식이 달라요. String
clientId (common) 사용할 JMS 클라이언트 ID예요. 값을 지정하면 유일해야 하고 단 하나의 JMS 커넥션 인스턴스만 쓸 수 있다는 점을 기억하세요. 보통은 JMS 1.1의 durable 토픽 구독에만 필요해요. String
connectionFactory (common) 사용할 커넥션 팩토리예요. 커넥션 팩토리는 컴포넌트나 엔드포인트 둘 중 한 곳에는 반드시 설정되어 있어야 해요. ConnectionFactory
disableReplyTo (common) 메시지의 JMSReplyTo 헤더를 Camel이 무시할지 지정해요. true면 Camel은 JMSReplyTo 헤더가 가리키는 목적지로 답장을 보내지 않아요. 라우트로 소비만 하고 답장은 코드의 다른 컴포넌트가 처리하도록 맡기고 싶을 때, 혹은 서로 다른 메시지 브로커 사이에서 Camel을 프록시처럼 쓰며 한 시스템에서 다른 시스템으로 메시지를 라우팅하고 싶을 때 이 옵션을 사용해요. false boolean
durableSubscriptionName (common) durable 토픽 구독을 지정할 때 쓰는 durable 구독자 이름이에요. clientId 옵션도 함께 설정해야 해요. String
host (common) AMQP 브로커가 돌고 있는 컴퓨터의 호스트 이름이나 IP 주소예요. String
includeAmqpAnnotations (common) AMQP에서 Camel Message로 매핑할 때 AMQP 어노테이션을 포함할지 여부예요. true로 하면 JMS_AMQP_MA_ 접두사를 가진 AMQP 메시지 어노테이션이 메시지 헤더로 매핑돼요. 다만 Apache Qpid JMS API의 제약 때문에 현재는 delivery 어노테이션은 무시돼요. false boolean
jmsMessageType (common) Camel에서 브로커로 JMS 메시지를 보낼 때(request/reply에서 Camel이 보내는 경우 포함) 특정 jakarta.jms.Message 구현체를 강제로 쓰도록 해줘요. Camel이 메시지를 받을 때는 브로커로 보낸 클라이언트가 타입을 정해놓기 때문에 이 옵션이 적용되지 않아요. 가능한 값은 Bytes, Map, Object, Stream, Text예요. 기본적으로는 Camel이 메시지 본문 타입에서 JMS 메시지 타입을 판단하는데, 이 옵션으로 직접 지정할 수 있어요.

Enum values:

  • Bytes

  • Map

  • Object

  • Stream

  • Text

| | JmsMessageType | | keyStoreLocation (common) | SSL 키스토어 위치예요. | | String | | keyStoreType (common) | SSL 키스토어 타입이에요. | JKS | String | | port (common) | AMQP 브로커가 리슨하는 포트 번호예요. | | Integer | | replyTo (common) | 명시적인 ReplyTo 목적지를 지정해요. 소비자 쪽에서 들어온 Message.getJMSReplyTo() 값을 덮어써요. | | String | | testConnectionOnStartup (common) | 시작할 때 커넥션을 테스트할지 지정해요. 이렇게 하면 Camel이 시작될 때 모든 JMS 컨슈머가 브로커에 유효한 커넥션을 갖고 있는지 확인해요. 커넥션을 얻지 못하면 시작 시 예외를 던져서, 실패한 커넥션 상태로 Camel이 뜨는 상황을 막아줘요. JMS 프로듀서도 함께 테스트돼요. | false | boolean | | trustStoreLocation (common) | SSL 트러스트스토어 위치예요. | | String | | trustStoreType (common) | SSL 트러스트스토어 타입이에요. | JKS | String | | useSsl (common) | AMQP 브로커에 접속할 때 SSL을 쓸지 여부예요. | false | Boolean | | useTopicPrefix (common) | 토픽에 topic:// 접두사를 붙여 구성할지 여부예요. | false | Boolean | | acknowledgementModeName (consumer) | JMS 승인(acknowledgement) 모드 이름이에요. SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE 중 하나를 고를 수 있어요. |

Enum values:

  • SESSION_TRANSACTED

  • CLIENT_ACKNOWLEDGE

  • AUTO_ACKNOWLEDGE

  • DUPS_OK_ACKNOWLEDGE

| AUTO_ACKNOWLEDGE | String | | artemisConsumerPriority (consumer) | 컨슈머 우선순위를 쓰면 활성 상태인 높은 우선순위 컨슈머가 메시지를 받도록 보장할 수 있어요. 보통 큐에 연결된 활성 컨슈머들은 라운드 로빈 방식으로 메시지를 받아요. 컨슈머 우선순위를 사용하면 같은 높은 우선순위의 활성 컨슈머가 여러 개일 때 그 사이에서 라운드 로빈으로 전달돼요. 높은 우선순위 컨슈머가 메시지를 받을 credit이 없거나 메시지 받기를 거절했을 때(예컨대 컨슈머에 연결된 셀렉터 기준에 맞지 않아서)에만 낮은 우선순위 컨슈머에게 메시지가 흘러가요. | | int | | asyncConsumer (consumer) | JmsConsumer가 Exchange를 비동기로 처리할지 여부예요. 켜두면 이전 메시지가 비동기로 처리되는 동안(Asynchronous Routing Engine이 담당) JmsConsumer가 JMS 큐에서 다음 메시지를 먼저 꺼낼 수 있어요. 그래서 메시지가 100% 엄격한 순서대로 처리되지 않을 수 있어요. 꺼두면(기본값) 이전 Exchange 처리가 끝나야 다음 메시지를 꺼내요. 참고로 transacted가 켜져 있으면 트랜잭션은 동기로 실행되어야 하기 때문에 asyncConsumer=true여도 비동기로 동작하지 않아요. | false | boolean | | autoStartup (consumer) | 컨슈머 컨테이너를 자동으로 시작할지 지정해요. | true | boolean | | cacheLevel (consumer) | 기반이 되는 JMS 자원에 대한 캐시 레벨을 ID로 지정해요. 자세한 내용은 cacheLevelName 옵션을 참고하세요. | | int | | cacheLevelName (consumer) | 기반이 되는 JMS 자원에 대한 캐시 레벨을 이름으로 지정해요. 가능한 값은 CACHE_AUTO, CACHE_CONNECTION, CACHE_CONSUMER, CACHE_NONE, CACHE_SESSION이고 기본값은 CACHE_AUTO예요. 자세한 내용은 Spring 문서와 Transactions Cache Levels를 참고하세요. |

Enum values:

  • CACHE_AUTO

  • CACHE_CONNECTION

  • CACHE_CONSUMER

  • CACHE_NONE

  • CACHE_SESSION

| CACHE_AUTO | String | | concurrentConsumers (consumer) | JMS에서 소비할 때 기본 동시 컨슈머 수를 지정해요(JMS 위에서의 request/reply에는 적용되지 않아요). 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. JMS 위에서 request/reply를 할 때는 replyToConcurrentConsumers 옵션으로 답장 리스너의 동시 컨슈머 수를 조절해요. | 1 | int | | maxConcurrentConsumers (consumer) | JMS에서 소비할 때 최대 동시 컨슈머 수를 지정해요(JMS 위에서의 request/reply에는 적용되지 않아요). 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. JMS 위에서 request/reply를 할 때는 replyToMaxConcurrentConsumers 옵션으로 답장 리스너의 최대 동시 컨슈머 수를 조절해요. | | int | | replyToDeliveryPersistent (consumer) | 답장 메시지에 기본으로 persistent 전달을 쓸지 지정해요. | true | boolean | | selector (consumer) | 사용할 JMS 셀렉터를 지정해요. | | String | | subscriptionDurable (consumer) | 구독을 durable로 만들지 여부예요. 쓸 durable 구독 이름은 subscriptionName 속성으로 지정할 수 있어요. 기본값은 false이고, durable 구독을 등록하려면 true로 바꾸세요. 보통은 subscriptionName 값과 함께 씁니다(메시지 리스너 클래스 이름이 구독 이름으로 충분하다면 없어도 돼요). 토픽(pub-sub 도메인)을 들을 때만 의미가 있어서, 이 메서드는 pubSubDomain 플래그도 함께 바꿔요. | false | boolean | | subscriptionName (consumer) | 만들 구독의 이름이에요. shared 또는 durable 구독을 쓰는 토픽(pub-sub 도메인)에서 적용돼요. 구독 이름은 이 클라이언트의 JMS 클라이언트 ID 안에서 유일해야 해요. 기본값은 지정된 메시지 리스너의 클래스 이름이에요. 참고: 공유 구독(JMS 2.0 필요)이 아닌 경우 구독마다 컨슈머 1개(이 메시지 리스너 컨테이너의 기본값)만 허용돼요. | | String | | subscriptionShared (consumer) | 구독을 shared로 만들지 여부예요. 쓸 공유 구독 이름은 subscriptionName 속성으로 지정할 수 있어요. 기본값은 false이고, 공유 구독을 등록하려면 true로 바꾸세요. 보통은 subscriptionName 값과 함께 씁니다(메시지 리스너 클래스 이름이 구독 이름으로 충분하다면 없어도 돼요). 공유 구독은 durable일 수도 있어서 subscriptionDurable과 함께 쓰는 경우가 많아요. 토픽(pub-sub 도메인)을 들을 때만 의미가 있어서 pubSubDomain 플래그도 함께 바뀌고, JMS 2.0 호환 브로커가 필요해요. | false | boolean | | acceptMessagesWhileStopping (consumer (advanced)) | 컨슈머가 멈추는 동안에도 메시지를 받아들일지 지정해요. 런타임에 JMS 라우트를 시작하고 멈추는데 큐에 아직 메시지가 쌓여 있다면 이 옵션을 켜는 걸 고려해 보세요. false 상태에서 JMS 라우트를 멈추면 메시지가 거부될 수 있고, 브로커가 재전송을 시도했다가 또 거부되고, 결국 브로커의 dead letter 큐로 옮겨질 수도 있어요. 이를 피하려면 이 옵션을 켜는 게 좋아요. | false | boolean | | allowReplyManagerQuickStop (consumer (advanced)) | request-reply 메시징의 reply manager가 쓰는 DefaultMessageListenerContainer가, JmsConfiguration#isAcceptMessagesWhileStopping이 켜져 있고 org.apache.camel.CamelContext가 멈추는 중일 때 runningAllowed 플래그로 빠르게 멈추는 걸 허용할지 여부예요. 이 빠른 정지 기능은 일반 JMS 컨슈머에는 기본으로 켜져 있고, reply manager에서 쓰려면 이 플래그를 켜야 해요. | false | boolean | | consumerType (consumer (advanced)) | 사용할 컨슈머 타입이에요. Simple, Default, Custom 중 하나를 고를 수 있고, 이 값이 어떤 Spring JMS 리스너를 쓸지 결정해요. Default는 org.springframework.jms.listener.DefaultMessageListenerContainer를, Simple은 org.springframework.jms.listener.SimpleMessageListenerContainer를 사용해요. Custom을 지정하면 messageListenerContainerFactory 옵션으로 정의한 MessageListenerContainerFactory가 어떤 org.springframework.jms.listener.AbstractMessageListenerContainer를 쓸지 결정해요. |

Enum values:

  • Simple

  • Default

  • Custom

| Default | ConsumerType | | defaultTaskExecutorType (consumer (advanced)) | DefaultMessageListenerContainer에서 기본으로 쓸 TaskExecutor 타입을 지정해요. 컨슈머 엔드포인트와 프로듀서 엔드포인트의 ReplyTo 컨슈머 양쪽에 적용돼요. 값은 SimpleAsync(Spring의 SimpleAsyncTaskExecutor 사용) 또는 ThreadPool(최적 값 - cached thread pool 비슷 - 을 쓰는 Spring의 ThreadPoolTaskExecutor 사용)이에요. 지정하지 않으면 이전 동작, 즉 컨슈머 엔드포인트에는 cached thread pool을, 답장 컨슈머에는 SimpleAsync를 쓰는 방식이 기본이에요. 동시 컨슈머 수가 늘었다 줄었다 하는 elastic 구성에서는 스레드 낭비를 줄이는 ThreadPool 사용이 권장돼요. |

Enum values:

  • ThreadPool

  • SimpleAsync

| | DefaultTaskExecutorType | | eagerLoadingOfProperties (consumer (advanced)) | 메시지가 로드되자마자 JMS 속성과 페이로드를 미리 로딩하는 옵션이에요. JMS 속성이 필요 없을 수도 있어서 보통은 비효율적이지만, 기반 JMS 프로바이더나 JMS 속성 사용에 문제가 있을 때 일찍 발견할 수는 있어요. eagerPoisonBody 옵션도 함께 보세요. | false | boolean | | eagerPoisonBody (consumer (advanced)) | eagerLoadingOfProperties가 켜져 있고 JMS 메시지 페이로드(JMS body나 JMS 속성)가 poison(읽거나 매핑할 수 없음)일 때, 대신 이 텍스트를 메시지 본문으로 넣어서 메시지가 처리되도록 해줘요(poison의 원인은 이미 Exchange의 예외로 저장되어 있어요). eagerPoisonBody=false로 설정하면 끌 수 있어요. eagerLoadingOfProperties 옵션도 함께 보세요. | Poison JMS message due to ${exception.message} | String | | exposeListenerSession (consumer (advanced)) | 메시지를 소비할 때 리스너 세션을 노출할지 지정해요. | true | boolean | | replyToConsumerType (consumer (advanced)) | request/reply를 할 때 답장 컨슈머의 타입이에요. Simple, Default, Custom 중 하나를 고를 수 있고, 이 값이 어떤 Spring JMS 리스너를 쓸지 결정해요. Default는 org.springframework.jms.listener.DefaultMessageListenerContainer를, Simple은 org.springframework.jms.listener.SimpleMessageListenerContainer를 사용해요. Custom을 지정하면 messageListenerContainerFactory 옵션으로 정의한 MessageListenerContainerFactory가 어떤 org.springframework.jms.listener.AbstractMessageListenerContainer를 쓸지 결정해요. |

Enum values:

  • Simple

  • Default

  • Custom

| Default | ConsumerType | | replyToSameDestinationAllowed (consumer (advanced)) | JMS 컨슈머가 자신이 소비 중인 것과 같은 목적지로 답장 메시지를 보내도 될지 여부예요. 이걸 막아두면 같은 메시지를 자기한테 계속 소비하고 돌려보내는 무한 루프를 예방해요. | false | boolean | | taskExecutor (consumer (advanced)) | 메시지를 소비할 때 쓸 커스텀 task executor를 지정할 수 있어요. | | TaskExecutor | | deliveryDelay (producer) | JMS로 보내는 send 호출에 적용할 delivery delay예요. 이 옵션은 JMS 2.0 호환 브로커가 필요해요. | -1 | long | | deliveryMode (producer) | 사용할 전달 모드를 지정해요. 가능한 값은 jakarta.jms.DeliveryMode에 정의된 값들이고, NON_PERSISTENT = 1, PERSISTENT = 2예요. |

Enum values:

  • 1

  • 2

| | Integer | | deliveryPersistent (producer) | 기본으로 persistent 전달을 쓸지 지정해요. | true | boolean | | explicitQosEnabled (producer) | 메시지를 보낼 때 deliveryMode, priority, timeToLive QoS를 적용할지 정해요. 이 옵션은 Spring의 JmsTemplate에 기반을 두고 있고, 세 옵션은 현재 엔드포인트에 적용돼요. 메시지 단위로 동작하면서 Camel In 메시지 헤더에서만 QoS 속성을 읽는 preserveMessageQos 옵션과는 대조적이에요. | false | Boolean | | formatDateHeadersToIso8601 (producer) | JMS 날짜 속성을 ISO 8601 표준 형식으로 표시할지 지정해요. | false | boolean | | lazyStartProducer (producer) | 프로듀서를 lazy(첫 메시지가 올 때)로 시작할지 여부예요. lazy로 시작하면 프로듀서가 시작 시점에 실패해서 라우트 시작까지 실패하는 상황에서도 CamelContext와 라우트를 띄울 수 있어요. 시작을 lazy로 미루면 시작 실패를 라우팅 중에 Camel의 라우팅 에러 핸들러로 처리할 수 있죠. 다만 첫 메시지를 처리할 때는 프로듀서를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 감안하세요. | false | boolean | | preserveMessageQos (producer) | JMS 엔드포인트의 QoS 설정 대신 메시지에 지정된 QoS 설정으로 메시지를 보내고 싶으면 true로 두세요. 고려되는 헤더는 JMSPriority, JMSDeliveryMode, JMSExpiration 세 개이고, 전부 줘도 일부만 줘도 돼요. 없는 값은 엔드포인트의 값으로 대체돼요. 즉 이 옵션을 쓰면 헤더가 엔드포인트 값을 덮어써요. 반대로 explicitQosEnabled 옵션은 엔드포인트에 설정된 옵션만 쓰고 메시지 헤더 값은 보지 않아요. | false | boolean | | priority (producer) | 1보다 큰 값이 메시지를 보낼 때의 우선순위가 돼요(1이 가장 낮고 9가 가장 높아요). 이 옵션이 실제로 효과를 내려면 explicitQosEnabled 옵션도 함께 켜야 해요. |

Enum values:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

| 4 | int | | replyToConcurrentConsumers (producer) | JMS 위에서 request/reply를 할 때 기본 동시 컨슈머 수를 지정해요. 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. | 1 | int | | replyToMaxConcurrentConsumers (producer) | JMS 위에서 request/reply를 할 때 최대 동시 컨슈머 수를 지정해요. 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. | | int | | replyToOnTimeoutMaxConcurrentConsumers (producer) | JMS 위에서 request/reply를 할 때 타임아웃이 발생한 뒤에도 라우팅을 계속할 수 있도록 하는 최대 동시 컨슈머 수를 지정해요. | 1 | int | | replyToOverride (producer) | JMS 메시지에 명시적인 ReplyTo 목적지를 넣어서 replyTo 설정을 덮어써요. 메시지를 원격 큐로 포워딩하고 답장은 ReplyTo 목적지에서 받고 싶을 때 유용해요. | | String | | replyToType (producer) | JMS 위에서 request/reply를 할 때 replyTo 큐에 어떤 전략을 쓸지 명시적으로 지정해요. 값은 Temporary, Shared, Exclusive예요. 기본은 temporary 큐인데, replyTo가 설정되어 있으면 기본이 Shared로 바뉘요. 이 옵션을 쓰면 shared 대신 exclusive 큐를 쓸 수 있어요. 자세한 내용은 Camel JMS 문서를 참고하고, 특히 클러스터 환경에서 돌릴 때의 영향과 Shared 답장 큐가 Temporary·Exclusive보다 성능이 낮다는 점도 확인하세요. |

Enum values:

  • Temporary

  • Shared

  • Exclusive

| | ReplyToType | | requestTimeout (producer) | InOut Exchange 패턴을 쓸 때 답장을 기다리는 타임아웃(밀리초)이에요. 기본값은 20초예요. CamelJmsRequestTimeout 헤더를 넣으면 엔드포인트에 설정된 이 값을 메시지별로 개별 타임아웃으로 덮어쓸 수 있어요. requestTimeoutCheckerInterval 옵션도 함께 보세요. | 20000 | long | | timeToLive (producer) | 메시지를 보낼 때 메시지의 time-to-live(밀리초)를 지정해요. | -1 | long | | allowAdditionalHeaders (producer (advanced)) | JMS 스펙상으로는 잘못된 값이 들어 있을 수 있는 추가 헤더를 허용할 때 쓰는 옵션이에요. 예를 들어 WMQ 같은 일부 메시지 시스템은 JMS_IBM_MQMD_ 접두사 헤더 이름에 byte 배열 같은 잘못된 타입의 값을 담기도 해요. 헤더 이름을 쉼표로 여러 개 지정할 수 있고, 접미사 와일드카드 매칭도 쓸 수 있어요. | | String | | allowNullBody (producer (advanced)) | 본문이 없는 메시지 보내기를 허용할지 여부예요. 이 옵션이 false인데 메시지 본문이 null이면 JMSException이 던져져요. | true | boolean | | alwaysCopyMessage (producer (advanced)) | true면 Camel이 프로듀서로 메시지를 보낼 때 항상 JMS 메시지 복사본을 만들어요. replyToDestinationSelectorName이 설정된 경우처럼 몇몇 상황에서는 복사가 필요해요(실제로 replyToDestinationSelectorName이 설정되면 Camel이 alwaysCopyMessage를 true로 바꿔 놓기도 해요). | false | boolean | | correlationProperty (producer (advanced)) | InOut exchange 패턴에서 메시지 상관(correlation)에 JMSCorrelationID 대신 이 JMS 속성을 사용해요. 설정하면 메시지는 오직 이 속성 값으로만 상관되고, JMSCorrelationID 속성은 무시되며 Camel이 설정하지도 않아요. | | String | | disableTimeToLive (producer (advanced)) | time to live를 강제로 끄는 옵션이에요. 예컨대 JMS 위에서 request/reply를 하면 Camel이 기본으로 requestTimeout 값을 보내는 메시지의 time to live로 쓰는데, 문제는 송수신 시스템의 시계가 맞아야 한다는 점이에요. 이게 항상 쉽지는 않죠. 그래서 disableTimeToLive=true로 두면 보내는 메시지에 time to live를 설정하지 않아서, 받는 시스템에서 메시지가 만료되지 않아요. 자세한 내용은 아래 About time to live 섹션을 참고하세요. | false | boolean | | forceSendOriginalMessage (producer (advanced)) | mapJmsMessage=false를 쓸 때 라우트 중에 헤더를 건드리면(get 또는 set) Camel이 새 JMS 메시지를 만들어 새 목적지로 보내요. 이 옵션을 true로 하면 받은 원본 JMS 메시지를 강제로 보내도록 만들 수 있어요. | false | boolean | | includeSentJMSMessageID (producer (advanced)) | InOnly(fire and forget)로 JMS 목적지에 보낼 때만 적용돼요. 이 옵션을 켜면 메시지가 JMS 목적지로 보내질 때 JMS 클라이언트가 실제로 사용한 JMSMessageID로 Camel Exchange를 보강해줘요. | false | boolean | | replyCorrelationProperty (producer (advanced)) | InOut exchange 패턴에서 답장 메시지의 상관(correlation)에 JMSCorrelationID 대신 이 JMS 속성을 사용해요. 'correlationProperty'와의 차이는, 'correlationProperty'는 요청 쪽 어느 속성이 상관 id 값을 담는지 알려줄 뿐 답장 셀렉터(JMSCorrelationID=)에는 영향을 주지 않지만, 'replyCorrelationProperty'는 답장 쪽 어느 속성이 상관 id 값을 담는지 알려주고 답장 셀렉터(=)에 실제로 영향을 준다는 점이에요. | | String | | replyToCacheLevelName (producer (advanced)) | JMS 위에서 request/reply를 할 때 답장 컨슈머의 캐시 레벨을 이름으로 지정해요. 이 옵션은 고정된 답장 큐(temporary가 아닌)를 쓸 때만 적용돼요. Camel의 기본값은 exclusive 큐나 replyToSelectorName이 있는 shared 큐에는 CACHE_CONSUMER, replyToSelectorName이 없는 shared 큐에는 CACHE_SESSION이에요. IBM WebSphere 같은 일부 JMS 브로커는 동작하려면 replyToCacheLevelName=CACHE_NONE을 설정해야 할 수도 있어요. 참고: temporary 큐를 쓸 때는 CACHE_NONE이 허용되지 않으니 CACHE_CONSUMER나 CACHE_SESSION 같은 더 높은 값을 써야 해요. |

Enum values:

  • CACHE_AUTO

  • CACHE_CONNECTION

  • CACHE_CONSUMER

  • CACHE_NONE

  • CACHE_SESSION

| | String | | replyToDestinationSelectorName (producer (advanced)) | 고정된 이름으로 JMS 셀렉터를 지정해서, 공유 큐를 쓸 때(즉 temporary 답장 큐를 쓰지 않을 때) 다른 사람의 답장은 걸러내고 내 답장만 받을 수 있게 해줘요. | | String | | streamMessageTypeEnabled (producer (advanced)) | StreamMessage 타입을 쓸지 여부예요. 파일, InputStream 같은 스트리밍 성격의 페이로드는 BytesMessage나 StreamMessage로 보내지는데, 이 옵션이 어느 쪽을 쓸지 정해요. 기본은 BytesMessage라서 페이로드 전체가 메모리로 읽혀야 해요. 이 옵션을 켜면 페이로드가 조각(chunk) 단위로 메모리에 읽히고, 각 조각이 데이터가 끝날 때까지 StreamMessage에 기록돼요. | false | boolean | | allowAutoWiredConnectionFactory (advanced) | 커넥션 팩토리가 설정되어 있지 않을 때 레지스트리에서 자동으로 찾을지 여부예요. ConnectionFactory 인스턴스가 하나만 발견되면 그걸 사용해요. 기본은 켜져 있어요. | true | boolean | | allowAutoWiredDestinationResolver (advanced) | destination resolver가 설정되어 있지 않을 때 레지스트리에서 자동으로 찾을지 여부예요. DestinationResolver 인스턴스가 하나만 발견되면 그걸 사용해요. 기본은 켜져 있어요. | true | boolean | | allowSerializedHeaders (advanced) | 직렬화된 헤더를 포함할지 여부예요. transferExchange가 true일 때만 적용되고, 객체가 직렬화 가능해야 해요. Camel은 직렬화할 수 없는 객체는 제외하고 WARN 레벨로 기록해요. | false | boolean | | artemisStreamingEnabled (advanced) | Apache Artemis 스트리밍 모드에 맞게 최적화할지 여부예요. Artemis에서 JMS StreamMessage 타입을 쓸 때 메모리 오버헤드를 줄일 수 있어요. Apache Artemis를 쓸 때만 켜야 하는 옵션이에요. | false | boolean | | asyncStartListener (advanced) | 라우트를 시작할 때 JmsConsumer 메시지 리스너를 비동기로 시작할지 여부예요. 예컨대 JmsConsumer가 원격 JMS 브로커에 커넥션을 못 얻으면 재시도나 fail-over를 하면서 막힐 수 있고, 그러면 Camel이 라우트를 시작하느라 같이 막혀요. 이 옵션을 true로 하면 JmsConsumer가 전용 스레드로 비동기 모드로 브로커에 연결하는 동안에도 라우트가 뜰 수 있어요. 다만 커넥션을 결국 못 맺으면 WARN 레벨로 예외가 기록되고 컨슈머는 메시지를 받지 못하니, 라우트를 다시 시작해서 재시도해야 해요. | false | boolean | | asyncStopListener (advanced) | 라우트를 멈출 때 JmsConsumer 메시지 리스너를 비동기로 멈출지 여부예요. | false | boolean | | autowiredEnabled (advanced) | autowiring을 켤지 여부예요. 레지스트리에서 타입이 맞는 인스턴스가 하나 있는지 찾아서 컴포넌트에 자동으로 설정해주는(옵션에 autowired 표시가 되어 있어야 해요) 자동 autowiring에 쓰여요. JDBC 데이터 소스, JMS 커넥션 팩토리, AWS 클라이언트 등을 자동 구성할 때 활용할 수 있어요. | true | boolean | | browseLimit (advanced) | 브라우징할 수 있도록 메모리에 유지하는 메시지의 최대 개수예요. 0이면 무제한이에요. | 100 | int | | configuration (advanced) | 공유 JMS 설정을 사용해요. | | JmsConfiguration | | destinationResolver (advanced) | 자체 resolver를 쓸 수 있게 해주는 pluggable org.springframework.jms.support.destination.DestinationResolver예요(예: JNDI 레지스트리에서 실제 목적지를 찾는 용도). | | DestinationResolver | | errorHandler (advanced) | 메시지 처리 중 잡히지 않은 예외가 던져졌을 때 호출되는 org.springframework.util.ErrorHandler를 지정해요. errorHandler를 설정하지 않으면 기본으로 이런 예외는 WARN 레벨로 기록돼요. errorHandlerLoggingLevel과 errorHandlerLogStackTrace 옵션으로 로깅 레벨과 스택 트레이스 기록 여부를 조절할 수 있어요. 커스텀 errorHandler를 직접 짜는 것보다 훨씬 간단하게 설정할 수 있죠. | | ErrorHandler | | exceptionListener (advanced) | 기반이 되는 JMS 예외가 발생했을 때 통지받을 JMS Exception Listener를 지정해요. | | ExceptionListener | | idleConsumerLimit (advanced) | 어느 시점이든 idle로 있을 수 있는 컨슈머 수의 상한을 지정해요. | 1 | int | | idleReceivesPerTaskLimit (advanced) | 지정한 횟수의 idle receive에 도달하면 컨슈머를 idle로 표시해요. idle receive는 설정된 setReceiveTimeout이 지난 뒤 receiver가 null 메시지를 돌려준 순간부터 세어요. 이 덕분에 idle task 수가 setIdleTaskExecutionLimit를 넘었는지 확인해서, 그에 따라 작업을 다시 스케줄링할지 말지 결정하고 자원을 아낄 수 있어요. 이 설정은 이 한계에 도달하면 메시지가 null이었든 아니든 작업을 해제하고 다시 스케줄링하는 setMaxMessagesPerTask와 달라요. 작업마다 충분히 큰 배치를 유지하고 싶은데 더는 처리할 메시지가 없어지는 순간에는 빨리 해제되길 원한다면, 이 설정만으로는 유연하지 않을 수 있어요. 또한 이 설정은 몇 번 idle로 표시된 후 작업을 해제할지 정하는 setIdleTaskExecutionLimit와도 달라요. 예컨대 setMaxMessagesPerTask가 '500'이고 #setIdleReceivesPerTaskLimit가 '60'이고 setReceiveTimeout이 '1000'이고 setIdleTaskExecutionLimit가 '1'이면, 이후 60개의 idle 메시지를 받지 않는 한 작업마다 500개 메시지가 처리되고, 60개 idle 메시지를 받으면 작업이 idle로 표시되어 해제돼요. 이는 마지막 메시지가 처리된 뒤 새 메시지가 오지 않는 한 60초 후에 작업이 해제된다는 뜻이기도 해요. | | int | | idleTaskExecutionLimit (advanced) | 실행 중 아무 메시지도 받지 못한 receive 작업의 idle 실행 상한이에요. 이 상한에 도달하면 작업이 종료되고 (동적 스케줄링이라면, maxConcurrentConsumers 설정 참고) 수신을 다른 실행 중인 작업에 넘겨요. Spring에서 추가 문서를 제공하니 참고하세요. | 1 | int | | includeAllJMSXProperties (advanced) | JMS에서 Camel Message로 매핑할 때 JMSX 접두사 속성을 전부 포함할지 여부예요. true로 하면 JMSXAppID, JMSXUserID 같은 속성도 포함돼요. 참고: 커스텀 headerFilterStrategy를 쓰면 이 옵션은 적용되지 않아요. | false | boolean | | includeCorrelationIDAsBytes (advanced) | JMS 컨슈머가 JMSCorrelationIDAsBytes를 Camel Message의 헤더로 포함할지 여부예요. | true | boolean | | jmsKeyFormatStrategy (advanced) | JMS 키를 인코딩/디코딩해서 JMS 스펙을 지키도록 해주는 pluggable 전략이에요. Camel은 default와 passthrough 두 구현체를 기본 제공해요. default 전략은 점과 하이픈(.과 -)을 안전하게 마샬링하고, passthrough 전략은 키를 그대로 둬요. JMS 헤더 키에 잘못된 문자가 있어도 신경 쓰지 않는 JMS 브로커에 쓸 수 있어요. org.apache.camel.component.jms.JmsKeyFormatStrategy를 직접 구현해서 # 표기법으로 참조할 수도 있어요. |

Enum values:

  • default

  • passthrough

| | JmsKeyFormatStrategy | | mapJmsMessage (advanced) | Camel이 받은 JMS 메시지를 적절한 페이로드 타입으로 자동 매핑할지 지정해요. 예컨대 jakarta.jms.TextMessage를 String으로 바꾸는 식이에요. | true | boolean | | maxMessagesPerTask (advanced) | 작업당 처리할 메시지 수예요. -1이면 무제한이에요. 동시 컨슈머에 범위(min max)를 쓰면, 이 옵션을 예컨대 100으로 지정해서 일이 줄어들 때 컨슈머가 얼마나 빨리 줄어들지 조절할 수 있어요. | -1 | int | | messageConverter (advanced) | 커스텀 Spring org.springframework.jms.support.converter.MessageConverter를 써서 jakarta.jms.Message와의 매핑을 직접 통제할 수 있어요. | | MessageConverter | | messageCreatedStrategy (advanced) | Camel이 JMS 메시지를 보낼 때 jakarta.jms.Message 객체의 새 인스턴스를 만들 때마다 호출되는 MessageCreatedStrategy를 사용해요. | | MessageCreatedStrategy | | messageIdEnabled (advanced) | 보낼 때 메시지 ID를 붙일지 지정해요. 이건 JMS 브로커에게 주는 힌트일 뿐이에요. 프로바이더가 힌트를 받아들이면 이 메시지들의 ID는 null이어야 하고, 힌트를 무시하면 평소처럼 유일한 값이 설정돼요. | true | boolean | | messageListenerContainerFactory (advanced) | 메시지를 소비할 때 어떤 org.springframework.jms.listener.AbstractMessageListenerContainer를 쓸지 정하는 MessageListenerContainerFactory의 레지스트리 ID예요. 이걸 설정하면 consumerType이 자동으로 Custom으로 바뀌어요. | | MessageListenerContainerFactory | | messageTimestampEnabled (advanced) | 메시지를 보낼 때 타임스탬프를 기본으로 넣을지 지정해요. 이것도 JMS 브로커에게 주는 힌트일 뿐이에요. 프로바이더가 힌트를 받아들이면 타임스탬프는 0이어야 하고, 힌트를 무시하면 평소 값이 설정돼요. | true | boolean | | objectMessageEnabled (advanced) | JMS ObjectMessage를 보내고 받는 기능을 켤지 여부예요. Java 객체 직렬화는 잘 알려진 보안 취약점이기 때문에 기본은 꺼져 있어요. 메시지 출처를 신뢰하면서 JMS로 Java 직렬화 객체를 주고받아야 할 때만 켜세요. 꺼져 있으면 Camel은 JMS ObjectMessage 인스턴스를 만들거나 읽는 걸 거부해요. transferExchange와 transferException처럼 내부적으로 ObjectMessage에 의존하는 옵션들은 이 옵션이 켜져 있어야 동작해요. | false | boolean | | pubSubNoLocal (advanced) | 자기 커넥션이 발행한 메시지의 전달을 막을지 지정해요. | false | boolean | | queueBrowseStrategy (advanced) | 큐를 브라우징할 때 커스텀 QueueBrowseStrategy를 사용해요. | | QueueBrowseStrategy | | receiveTimeout (advanced) | 메시지를 받을 때의 타임아웃(밀리초)이에요. | 1000 | long | | recoveryInterval (advanced) | 커넥션을 새로 맺는 등 복구 시도 사이의 간격(밀리초)이에요. 기본값은 5000ms, 즉 5초예요. | 5000 | long | | requestTimeoutCheckerInterval (advanced) | JMS 위에서 request/reply를 할 때 Camel이 타임아웃된 Exchange를 얼마나 자주 확인할지 설정해요. 기본은 1초에 한 번이에요. 타임아웃에 더 빨리 반응해야 한다면 이 간격을 줄여서 더 자주 확인하게 만들 수 있어요. 타임아웃 값은 requestTimeout 옵션으로 정해져요. | 1000 | long | | serviceLocationEnabled (advanced) | 시작할 때 JMS 브로커의 네트워크 주소 위치를 감지할지 여부예요. 이 정보는 ConnectionFactory에 대한 리플렉션으로 모아지고 벤더마다 달라요. 이 옵션으로 감지를 끌 수 있어요. | true | boolean | | synchronous (advanced) | 동기 처리를 엄격하게 강제할지 지정해요. | false | boolean | | temporaryQueueResolver (advanced) | temporary 큐를 만들 때 자체 resolver를 쓸 수 있게 해주는 pluggable TemporaryQueueResolver예요(temporary 큐 생성에 특별한 요구사항을 두는 메시징 시스템도 있어요). | | TemporaryQueueResolver | | transferException (advanced) | 켜두고 Request Reply 메시징(InOut)을 쓰는데 컨슈머 쪽에서 Exchange가 실패하면, 발생한 예외가 jakarta.jms.ObjectMessage로 답장에 실려 돌아와요. 클라이언트가 Camel이면 돌아온 예외를 다시 던져요. 덕분에 Camel JMS를 라우팅의 브리지로 쓸 수 있어요. 예컨대 persistent 큐로 견고한 라우팅을 하는 식이죠. transferExchange도 켜져 있으면 이 옵션이 우선한다는 점을 유의하세요. 잡은 예외는 직렬화 가능해야 하고, 컨슈머 쪽의 원본 예외는 프로듀서로 돌아올 때 org.apache.camel.RuntimeCamelException 같은 바깥 예외로 감싸질 수 있어요. 데이터가 Java 객체 직렬화를 쓰고 받는 쪽이 클래스 수준에서 역직렬화할 수 있어야 해서 프로듀서와 컨슈머가 강하게 결합되니, 이 옵션은 신중하게 쓰세요. | false | boolean | | transferExchange (advanced) | body와 헤더만이 아니라 exchange 전체를 네트워크로 전송할 수 있어요. 전송되는 필드는 In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange 속성, exchange 예외예요. 객체가 직렬화 가능해야 하고, Camel은 직렬화할 수 없는 객체는 제외하며 WARN 레벨로 기록해요. 프로듀서와 컨슈머 양쪽에서 이 옵션을 켜야 Camel이 페이로드를 일반 payload가 아니라 Exchange로 인식해요. 데이터가 Java 객체 직렬화를 쓰고 받는 쪽이 클래스 수준에서 역직렬화할 수 있어야 해서 프로듀서와 컨슈머가 호환되는 Camel 버전을 쓰도록 강하게 결합되니, 신중하게 쓰세요. | false | boolean | | useMessageIDAsCorrelationID (advanced) | InOut 메시지에서 JMSMessageID를 항상 JMSCorrelationID로 쓸지 지정해요. | false | boolean | | waitForProvisionCorrelationToBeUpdatedCounter (advanced) | JMS 위에서 request/reply를 하면서 useMessageIDAsCorrelationID 옵션이 켜져 있을 때, 임시 상관 id가 실제 상관 id로 갱신되기를 기다리는 횟수예요. | 50 | int | | waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 임시 상관 id가 갱신되기를 기다리는 동안 매번 대기하는 간격(밀리초)이에요. | 100 | long | | waitForTemporaryReplyToToBeUpdatedCounter (advanced) | JMS 위에서 request/reply를 할 때 temporary replyTo 큐가 만들어져 준비되기를 기다리는 횟수예요. | 200 | int | | waitForTemporaryReplyToToBeUpdatedThreadSleepingTime (advanced) | temporary replyTo 큐가 준비되기를 기다리는 동안 매번 대기하는 간격(밀리초)이에요. | 100 | long | | headerFilterStrategy (filter) | Camel 메시지의 헤더를 걸러낼 때 쓰는 커스텀 org.apache.camel.spi.HeaderFilterStrategy를 지정해요. | | HeaderFilterStrategy | | errorHandlerLoggingLevel (logging) | 잡히지 않은 예외를 기록할 때 기본 errorHandler의 로깅 레벨을 설정할 수 있어요. |

Enum values:

  • TRACE

  • DEBUG

  • INFO

  • WARN

  • ERROR

  • OFF

| WARN | LoggingLevel | | errorHandlerLogStackTrace (logging) | 기본 errorHandler가 스택 트레이스를 기록할지 여부를 조절할 수 있어요. | true | boolean | | deserializationFilter (security) | jakarta.jms.ObjectMessage.getObject()가 돌려주는 body의 클래스에 심층 방어(defense-in-depth) 확인으로 적용하는 ObjectInputFilter 패턴(jdk.serialFilter 문법)이에요. 이 패턴은 JMS 프로바이더가 페이로드를 역직렬화한 뒤에 평가되므로, 이 옵션만으로는 프로바이더의 ObjectInputStream 안에서 일어나는 gadget-chain 실행을 막을 수 없어요. 그런 공격을 차단하려면 JMS 프로바이더 자체의 역직렬화 필터나 JVM 전역 -Djdk.serialFilter도 함께 설정하세요. 이 옵션을 설정하지 않고 JVM 전역 필터도 없으면, java.net.은 거부하고 java., javax., org.apache.camel.은 허용하는 보수적인 기본 필터가 적용돼요. | | String | | keyStorePassword (security) | SSL 키스토어 비밀번호예요. | | String | | password (security) | ConnectionFactory에서 쓸 비밀번호예요. username/password를 ConnectionFactory에 바로 설정할 수도 있어요. | | String | | trustStorePassword (security) | SSL 트러스트스토어 비밀번호예요. | | String | | username (security) | ConnectionFactory에서 쓸 사용자 이름이에요. username/password를 ConnectionFactory에 바로 설정할 수도 있어요. | | String | | transacted (transaction) | transacted 모드를 쓸지 지정해요. | false | boolean | | transactedInOut (transaction) | InOut 연산(request reply)이 기본으로 transacted 모드를 쓸지 지정해요. 이 플래그를 true로 하면 InOut에 쓰는 Spring JmsTemplate은 sessionTransacted가 true가 되고 acknowledgeMode가 transacted가 돼요. Spring JMS 참고: JTA 트랜잭션 안에서는 createQueue, createTopic 메서드에 넘기는 파라미터가 반영되지 않아요. Java EE 트랜잭션 컨텍스트에 따라 컨테이너가 이 값들을 스스로 결정하거든요. 마찬가지로 로컬 관리 트랜잭션 안에서도 이 파라미터는 반영되지 않는데, 이 경우 Spring JMS는 기존 JMS Session 위에서 동작하기 때문이에요. 이 플래그를 true로 하면 관리 트랜잭션 밖에서는 짧은 로컬 JMS 트랜잭션을, (XA가 아닌) 관리 트랜잭션이 있으면 동기화된 로컬 JMS 트랜잭션을 써요. 그 결과 로컬 JMS 트랜잭션이 메인 트랜잭션(native JDBC 트랜잭션일 수도 있어요)과 함께 관리되고, JMS 트랜잭션은 메인 트랜잭션 직후에 커밋돼요. | false | boolean | | lazyCreateTransactionManager (transaction (advanced)) | true면 transacted=true인데 주입된 transactionManager가 없을 때 Camel이 JmsTransactionManager를 만들어요. | true | boolean | | transactionManager (transaction (advanced)) | 사용할 Spring 트랜잭션 매니저예요. | | PlatformTransactionManager | | transactionName (transaction (advanced)) | 사용할 트랜잭션의 이름이에요. | | String | | transactionTimeout (transaction (advanced)) | transacted 모드를 쓸 때 트랜잭션의 타임아웃 값(초)이에요. | -1 | int |

Endpoint Options

AMQP 엔드포인트는 다음 URI 문법으로 설정돼요:

amqp:destinationType:destinationName

다음의 _path_와 query 파라미터를 쓸 수 있어요:

Path Parameters

Query Parameters

Name Description Default Type
destinationType (common) 사용할 목적지의 종류예요.

Enum values:

  • queue

  • topic

  • temp-queue

  • temp-topic

| queue | String | | destinationName (common) | 필수 목적지로 쓸 큐나 토픽의 이름이에요. | | String |

Name Description Default Type
clientId (common) 사용할 JMS 클라이언트 ID예요. 값을 지정하면 유일해야 하고 단 하나의 JMS 커넥션 인스턴스만 쓸 수 있다는 점을 기억하세요. 보통은 JMS 1.1의 durable 토픽 구독에만 필요해요. String
connectionFactory (common) 사용할 커넥션 팩토리예요. 커넥션 팩토리는 컴포넌트나 엔드포인트 둘 중 한 곳에는 반드시 설정되어 있어야 해요. ConnectionFactory
disableReplyTo (common) 메시지의 JMSReplyTo 헤더를 Camel이 무시할지 지정해요. true면 Camel은 JMSReplyTo 헤더가 가리키는 목적지로 답장을 보내지 않아요. 라우트로 소비만 하고 답장은 코드의 다른 컴포넌트가 처리하도록 맡기고 싶을 때, 혹은 서로 다른 메시지 브로커 사이에서 Camel을 프록시처럼 쓰며 한 시스템에서 다른 시스템으로 메시지를 라우팅하고 싶을 때 이 옵션을 사용해요. false boolean
durableSubscriptionName (common) durable 토픽 구독을 지정할 때 쓰는 durable 구독자 이름이에요. clientId 옵션도 함께 설정해야 해요. String
jmsMessageType (common) Camel에서 브로커로 JMS 메시지를 보낼 때(request/reply에서 Camel이 보내는 경우 포함) 특정 jakarta.jms.Message 구현체를 강제로 쓰도록 해줘요. Camel이 메시지를 받을 때는 브로커로 보낸 클라이언트가 타입을 정해놓기 때문에 이 옵션이 적용되지 않아요. 가능한 값은 Bytes, Map, Object, Stream, Text예요. 기본적으로는 Camel이 메시지 본문 타입에서 JMS 메시지 타입을 판단하는데, 이 옵션으로 직접 지정할 수 있어요.

Enum values:

  • Bytes

  • Map

  • Object

  • Stream

  • Text

| | JmsMessageType | | replyTo (common) | 명시적인 ReplyTo 목적지를 지정해요. 소비자 쪽에서 들어온 Message.getJMSReplyTo() 값을 덮어써요. | | String | | testConnectionOnStartup (common) | 시작할 때 커넥션을 테스트할지 지정해요. 이렇게 하면 Camel이 시작될 때 모든 JMS 컨슈머가 브로커에 유효한 커넥션을 갖고 있는지 확인해요. 커넥션을 얻지 못하면 시작 시 예외를 던져서, 실패한 커넥션 상태로 Camel이 뜨는 상황을 막아줘요. JMS 프로듀서도 함께 테스트돼요. | false | boolean | | acknowledgementModeName (consumer) | JMS 승인(acknowledgement) 모드 이름이에요. SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE 중 하나를 고를 수 있어요. |

Enum values:

  • SESSION_TRANSACTED

  • CLIENT_ACKNOWLEDGE

  • AUTO_ACKNOWLEDGE

  • DUPS_OK_ACKNOWLEDGE

| AUTO_ACKNOWLEDGE | String | | artemisConsumerPriority (consumer) | 컨슈머 우선순위를 쓰면 활성 상태인 높은 우선순위 컨슈머가 메시지를 받도록 보장할 수 있어요. 보통 큐에 연결된 활성 컨슈머들은 라운드 로빈 방식으로 메시지를 받아요. 컨슈머 우선순위를 사용하면 같은 높은 우선순위의 활성 컨슈머가 여러 개일 때 그 사이에서 라운드 로빈으로 전달돼요. 높은 우선순위 컨슈머가 메시지를 받을 credit이 없거나 메시지 받기를 거절했을 때(예컨대 컨슈머에 연결된 셀렉터 기준에 맞지 않아서)에만 낮은 우선순위 컨슈머에게 메시지가 흘러가요. | | int | | asyncConsumer (consumer) | JmsConsumer가 Exchange를 비동기로 처리할지 여부예요. 켜두면 이전 메시지가 비동기로 처리되는 동안(Asynchronous Routing Engine이 담당) JmsConsumer가 JMS 큐에서 다음 메시지를 먼저 꺼낼 수 있어요. 그래서 메시지가 100% 엄격한 순서대로 처리되지 않을 수 있어요. 꺼두면(기본값) 이전 Exchange 처리가 끝나야 다음 메시지를 꺼내요. 참고로 transacted가 켜져 있으면 트랜잭션은 동기로 실행되어야 하기 때문에 asyncConsumer=true여도 비동기로 동작하지 않아요. | false | boolean | | autoStartup (consumer) | 컨슈머 컨테이너를 자동으로 시작할지 지정해요. | true | boolean | | cacheLevel (consumer) | 기반이 되는 JMS 자원에 대한 캐시 레벨을 ID로 지정해요. 자세한 내용은 cacheLevelName 옵션을 참고하세요. | | int | | cacheLevelName (consumer) | 기반이 되는 JMS 자원에 대한 캐시 레벨을 이름으로 지정해요. 가능한 값은 CACHE_AUTO, CACHE_CONNECTION, CACHE_CONSUMER, CACHE_NONE, CACHE_SESSION이고 기본값은 CACHE_AUTO예요. 자세한 내용은 Spring 문서와 Transactions Cache Levels를 참고하세요. |

Enum values:

  • CACHE_AUTO

  • CACHE_CONNECTION

  • CACHE_CONSUMER

  • CACHE_NONE

  • CACHE_SESSION

| CACHE_AUTO | String | | concurrentConsumers (consumer) | JMS에서 소비할 때 기본 동시 컨슈머 수를 지정해요(JMS 위에서의 request/reply에는 적용되지 않아요). 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. JMS 위에서 request/reply를 할 때는 replyToConcurrentConsumers 옵션으로 답장 리스너의 동시 컨슈머 수를 조절해요. | 1 | int | | maxConcurrentConsumers (consumer) | JMS에서 소비할 때 최대 동시 컨슈머 수를 지정해요(JMS 위에서의 request/reply에는 적용되지 않아요). 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. JMS 위에서 request/reply를 할 때는 replyToMaxConcurrentConsumers 옵션으로 답장 리스너의 최대 동시 컨슈머 수를 조절해요. | | int | | replyToDeliveryPersistent (consumer) | 답장 메시지에 기본으로 persistent 전달을 쓸지 지정해요. | true | boolean | | selector (consumer) | 사용할 JMS 셀렉터를 지정해요. | | String | | subscriptionDurable (consumer) | 구독을 durable로 만들지 여부예요. 쓸 durable 구독 이름은 subscriptionName 속성으로 지정할 수 있어요. 기본값은 false이고, durable 구독을 등록하려면 true로 바꾸세요. 보통은 subscriptionName 값과 함께 씁니다(메시지 리스너 클래스 이름이 구독 이름으로 충분하다면 없어도 돼요). 토픽(pub-sub 도메인)을 들을 때만 의미가 있어서, 이 메서드는 pubSubDomain 플래그도 함께 바꿔요. | false | boolean | | subscriptionName (consumer) | 만들 구독의 이름이에요. shared 또는 durable 구독을 쓰는 토픽(pub-sub 도메인)에서 적용돼요. 구독 이름은 이 클라이언트의 JMS 클라이언트 ID 안에서 유일해야 해요. 기본값은 지정된 메시지 리스너의 클래스 이름이에요. 참고: 공유 구독(JMS 2.0 필요)이 아닌 경우 구독마다 컨슈머 1개(이 메시지 리스너 컨테이너의 기본값)만 허용돼요. | | String | | subscriptionShared (consumer) | 구독을 shared로 만들지 여부예요. 쓸 공유 구독 이름은 subscriptionName 속성으로 지정할 수 있어요. 기본값은 false이고, 공유 구독을 등록하려면 true로 바꾸세요. 보통은 subscriptionName 값과 함께 씁니다(메시지 리스너 클래스 이름이 구독 이름으로 충분하다면 없어도 돼요). 공유 구독은 durable일 수도 있어서 subscriptionDurable과 함께 쓰는 경우가 많아요. 토픽(pub-sub 도메인)을 들을 때만 의미가 있어서 pubSubDomain 플래그도 함께 바뀌고, JMS 2.0 호환 브로커가 필요해요. | false | boolean | | acceptMessagesWhileStopping (consumer (advanced)) | 컨슈머가 멈추는 동안에도 메시지를 받아들일지 지정해요. 런타임에 JMS 라우트를 시작하고 멈추는데 큐에 아직 메시지가 쌓여 있다면 이 옵션을 켜는 걸 고려해 보세요. false 상태에서 JMS 라우트를 멈추면 메시지가 거부될 수 있고, 브로커가 재전송을 시도했다가 또 거부되고, 결국 브로커의 dead letter 큐로 옮겨질 수도 있어요. 이를 피하려면 이 옵션을 켜는 게 좋아요. | false | boolean | | allowReplyManagerQuickStop (consumer (advanced)) | request-reply 메시징의 reply manager가 쓰는 DefaultMessageListenerContainer가, JmsConfiguration#isAcceptMessagesWhileStopping이 켜져 있고 org.apache.camel.CamelContext가 멈추는 중일 때 runningAllowed 플래그로 빠르게 멈추는 걸 허용할지 여부예요. 이 빠른 정지 기능은 일반 JMS 컨슈머에는 기본으로 켜져 있고, reply manager에서 쓰려면 이 플래그를 켜야 해요. | false | boolean | | consumerType (consumer (advanced)) | 사용할 컨슈머 타입이에요. Simple, Default, Custom 중 하나를 고를 수 있고, 이 값이 어떤 Spring JMS 리스너를 쓸지 결정해요. Default는 org.springframework.jms.listener.DefaultMessageListenerContainer를, Simple은 org.springframework.jms.listener.SimpleMessageListenerContainer를 사용해요. Custom을 지정하면 messageListenerContainerFactory 옵션으로 정의한 MessageListenerContainerFactory가 어떤 org.springframework.jms.listener.AbstractMessageListenerContainer를 쓸지 결정해요. |

Enum values:

  • Simple

  • Default

  • Custom

| Default | ConsumerType | | defaultTaskExecutorType (consumer (advanced)) | DefaultMessageListenerContainer에서 기본으로 쓸 TaskExecutor 타입을 지정해요. 컨슈머 엔드포인트와 프로듀서 엔드포인트의 ReplyTo 컨슈머 양쪽에 적용돼요. 값은 SimpleAsync(Spring의 SimpleAsyncTaskExecutor 사용) 또는 ThreadPool(최적 값 - cached thread pool 비슷 - 을 쓰는 Spring의 ThreadPoolTaskExecutor 사용)이에요. 지정하지 않으면 이전 동작, 즉 컨슈머 엔드포인트에는 cached thread pool을, 답장 컨슈머에는 SimpleAsync를 쓰는 방식이 기본이에요. 동시 컨슈머 수가 늘었다 줄었다 하는 elastic 구성에서는 스레드 낭비를 줄이는 ThreadPool 사용이 권장돼요. |

Enum values:

  • ThreadPool

  • SimpleAsync

| | DefaultTaskExecutorType | | eagerLoadingOfProperties (consumer (advanced)) | 메시지가 로드되자마자 JMS 속성과 페이로드를 미리 로딩하는 옵션이에요. JMS 속성이 필요 없을 수도 있어서 보통은 비효율적이지만, 기반 JMS 프로바이더나 JMS 속성 사용에 문제가 있을 때 일찍 발견할 수는 있어요. eagerPoisonBody 옵션도 함께 보세요. | false | boolean | | eagerPoisonBody (consumer (advanced)) | eagerLoadingOfProperties가 켜져 있고 JMS 메시지 페이로드(JMS body나 JMS 속성)가 poison(읽거나 매핑할 수 없음)일 때, 대신 이 텍스트를 메시지 본문으로 넣어서 메시지가 처리되도록 해줘요(poison의 원인은 이미 Exchange의 예외로 저장되어 있어요). eagerPoisonBody=false로 설정하면 끌 수 있어요. eagerLoadingOfProperties 옵션도 함께 보세요. | Poison JMS message due to ${exception.message} | String | | exceptionHandler (consumer (advanced)) | 컨슈머가 커스텀 ExceptionHandler를 쓰게 할 수 있어요. 참고로 bridgeErrorHandler 옵션이 켜져 있으면 이 옵션은 사용되지 않아요. 기본적으로 컨슈머는 예외를 직접 처리해서 WARN이나 ERROR 레벨로 기록하고 무시해요. | | ExceptionHandler | | exchangePattern (consumer (advanced)) | 컨슈머가 exchange를 만들 때의 exchange 패턴을 설정해요. |

Enum values:

  • InOnly

  • InOut

| | ExchangePattern | | exposeListenerSession (consumer (advanced)) | 메시지를 소비할 때 리스너 세션을 노출할지 지정해요. | true | boolean | | replyToConsumerType (consumer (advanced)) | request/reply를 할 때 답장 컨슈머의 타입이에요. Simple, Default, Custom 중 하나를 고를 수 있고, 이 값이 어떤 Spring JMS 리스너를 쓸지 결정해요. Default는 org.springframework.jms.listener.DefaultMessageListenerContainer를, Simple은 org.springframework.jms.listener.SimpleMessageListenerContainer를 사용해요. Custom을 지정하면 messageListenerContainerFactory 옵션으로 정의한 MessageListenerContainerFactory가 어떤 org.springframework.jms.listener.AbstractMessageListenerContainer를 쓸지 결정해요. |

Enum values:

  • Simple

  • Default

  • Custom

| Default | ConsumerType | | replyToSameDestinationAllowed (consumer (advanced)) | JMS 컨슈머가 자신이 소비 중인 것과 같은 목적지로 답장 메시지를 보내도 될지 여부예요. 이걸 막아두면 같은 메시지를 자기한테 계속 소비하고 돌려보내는 무한 루프를 예방해요. | false | boolean | | taskExecutor (consumer (advanced)) | 메시지를 소비할 때 쓸 커스텀 task executor를 지정할 수 있어요. | | TaskExecutor | | deliveryDelay (producer) | JMS로 보내는 send 호출에 적용할 delivery delay예요. 이 옵션은 JMS 2.0 호환 브로커가 필요해요. | -1 | long | | deliveryMode (producer) | 사용할 전달 모드를 지정해요. 가능한 값은 jakarta.jms.DeliveryMode에 정의된 값들이고, NON_PERSISTENT = 1, PERSISTENT = 2예요. |

Enum values:

  • 1

  • 2

| | Integer | | deliveryPersistent (producer) | 기본으로 persistent 전달을 쓸지 지정해요. | true | boolean | | explicitQosEnabled (producer) | 메시지를 보낼 때 deliveryMode, priority, timeToLive QoS를 적용할지 정해요. 이 옵션은 Spring의 JmsTemplate에 기반을 두고 있고, 세 옵션은 현재 엔드포인트에 적용돼요. 메시지 단위로 동작하면서 Camel In 메시지 헤더에서만 QoS 속성을 읽는 preserveMessageQos 옵션과는 대조적이에요. | false | Boolean | | formatDateHeadersToIso8601 (producer) | JMS 날짜 속성을 ISO 8601 표준 형식으로 표시할지 지정해요. | false | boolean | | preserveMessageQos (producer) | JMS 엔드포인트의 QoS 설정 대신 메시지에 지정된 QoS 설정으로 메시지를 보내고 싶으면 true로 두세요. 고려되는 헤더는 JMSPriority, JMSDeliveryMode, JMSExpiration 세 개이고, 전부 줘도 일부만 줘도 돼요. 없는 값은 엔드포인트의 값으로 대체돼요. 즉 이 옵션을 쓰면 헤더가 엔드포인트 값을 덮어써요. 반대로 explicitQosEnabled 옵션은 엔드포인트에 설정된 옵션만 쓰고 메시지 헤더 값은 보지 않아요. | false | boolean | | priority (producer) | 1보다 큰 값이 메시지를 보낼 때의 우선순위가 돼요(1이 가장 낮고 9가 가장 높아요). 이 옵션이 실제로 효과를 내려면 explicitQosEnabled 옵션도 함께 켜야 해요. |

Enum values:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

| 4 | int | | replyToConcurrentConsumers (producer) | JMS 위에서 request/reply를 할 때 기본 동시 컨슈머 수를 지정해요. 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. | 1 | int | | replyToMaxConcurrentConsumers (producer) | JMS 위에서 request/reply를 할 때 최대 동시 컨슈머 수를 지정해요. 스레드를 동적으로 늘렸다 줄이는 조절은 maxMessagesPerTask 옵션을 함께 보세요. | | int | | replyToOnTimeoutMaxConcurrentConsumers (producer) | JMS 위에서 request/reply를 할 때 타임아웃이 발생한 뒤에도 라우팅을 계속할 수 있도록 하는 최대 동시 컨슈머 수를 지정해요. | 1 | int | | replyToOverride (producer) | JMS 메시지에 명시적인 ReplyTo 목적지를 넣어서 replyTo 설정을 덮어써요. 메시지를 원격 큐로 포워딩하고 답장은 ReplyTo 목적지에서 받고 싶을 때 유용해요. | | String | | replyToType (producer) | JMS 위에서 request/reply를 할 때 replyTo 큐에 어떤 전략을 쓸지 명시적으로 지정해요. 값은 Temporary, Shared, Exclusive예요. 기본은 temporary 큐인데, replyTo가 설정되어 있으면 기본이 Shared로 바뉘요. 이 옵션을 쓰면 shared 대신 exclusive 큐를 쓸 수 있어요. 자세한 내용은 Camel JMS 문서를 참고하고, 특히 클러스터 환경에서 돌릴 때의 영향과 Shared 답장 큐가 Temporary·Exclusive보다 성능이 낮다는 점도 확인하세요. |

Enum values:

  • Temporary

  • Shared

  • Exclusive

| | ReplyToType | | requestTimeout (producer) | InOut Exchange 패턴을 쓸 때 답장을 기다리는 타임아웃(밀리초)이에요. 기본값은 20초예요. CamelJmsRequestTimeout 헤더를 넣으면 엔드포인트에 설정된 이 값을 메시지별로 개별 타임아웃으로 덮어쓸 수 있어요. requestTimeoutCheckerInterval 옵션도 함께 보세요. | 20000 | long | | timeToLive (producer) | 메시지를 보낼 때 메시지의 time-to-live(밀리초)를 지정해요. | -1 | long | | allowAdditionalHeaders (producer (advanced)) | JMS 스펙상으로는 잘못된 값이 들어 있을 수 있는 추가 헤더를 허용할 때 쓰는 옵션이에요. 예를 들어 WMQ 같은 일부 메시지 시스템은 JMS_IBM_MQMD_ 접두사 헤더 이름에 byte 배열 같은 잘못된 타입의 값을 담기도 해요. 헤더 이름을 쉼표로 여러 개 지정할 수 있고, 접미사 와일드카드 매칭도 쓸 수 있어요. | | String | | allowNullBody (producer (advanced)) | 본문이 없는 메시지 보내기를 허용할지 여부예요. 이 옵션이 false인데 메시지 본문이 null이면 JMSException이 던져져요. | true | boolean | | alwaysCopyMessage (producer (advanced)) | true면 Camel이 프로듀서로 메시지를 보낼 때 항상 JMS 메시지 복사본을 만들어요. replyToDestinationSelectorName이 설정된 경우처럼 몇몇 상황에서는 복사가 필요해요(실제로 replyToDestinationSelectorName이 설정되면 Camel이 alwaysCopyMessage를 true로 바꿔 놓기도 해요). | false | boolean | | correlationProperty (producer (advanced)) | InOut exchange 패턴에서 메시지 상관(correlation)에 JMSCorrelationID 대신 이 JMS 속성을 사용해요. 설정하면 메시지는 오직 이 속성 값으로만 상관되고, JMSCorrelationID 속성은 무시되며 Camel이 설정하지도 않아요. | | String | | disableTimeToLive (producer (advanced)) | time to live를 강제로 끄는 옵션이에요. 예컨대 JMS 위에서 request/reply를 하면 Camel이 기본으로 requestTimeout 값을 보내는 메시지의 time to live로 쓰는데, 문제는 송수신 시스템의 시계가 맞아야 한다는 점이에요. 이게 항상 쉽지는 않죠. 그래서 disableTimeToLive=true로 두면 보내는 메시지에 time to live를 설정하지 않아서, 받는 시스템에서 메시지가 만료되지 않아요. 자세한 내용은 아래 About time to live 섹션을 참고하세요. | false | boolean | | forceSendOriginalMessage (producer (advanced)) | mapJmsMessage=false를 쓸 때 라우트 중에 헤더를 건드리면(get 또는 set) Camel이 새 JMS 메시지를 만들어 새 목적지로 보내요. 이 옵션을 true로 하면 받은 원본 JMS 메시지를 강제로 보내도록 만들 수 있어요. | false | boolean | | includeSentJMSMessageID (producer (advanced)) | InOnly(fire and forget)로 JMS 목적지에 보낼 때만 적용돼요. 이 옵션을 켜면 메시지가 JMS 목적지로 보내질 때 JMS 클라이언트가 실제로 사용한 JMSMessageID로 Camel Exchange를 보강해줘요. | false | boolean | | lazyStartProducer (producer (advanced)) | 프로듀서를 lazy(첫 메시지가 올 때)로 시작할지 여부예요. lazy로 시작하면 프로듀서가 시작 시점에 실패해서 라우트 시작까지 실패하는 상황에서도 CamelContext와 라우트를 띄울 수 있어요. 시작을 lazy로 미루면 시작 실패를 라우팅 중에 Camel의 라우팅 에러 핸들러로 처리할 수 있죠. 다만 첫 메시지를 처리할 때는 프로듀서를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 감안하세요. | false | boolean | | replyCorrelationProperty (producer (advanced)) | InOut exchange 패턴에서 답장 메시지의 상관(correlation)에 JMSCorrelationID 대신 이 JMS 속성을 사용해요. 'correlationProperty'와의 차이는, 'correlationProperty'는 요청 쪽 어느 속성이 상관 id 값을 담는지 알려줄 뿐 답장 셀렉터(JMSCorrelationID=)에는 영향을 주지 않지만, 'replyCorrelationProperty'는 답장 쪽 어느 속성이 상관 id 값을 담는지 알려주고 답장 셀렉터(=)에 실제로 영향을 준다는 점이에요. | | String | | replyToCacheLevelName (producer (advanced)) | JMS 위에서 request/reply를 할 때 답장 컨슈머의 캐시 레벨을 이름으로 지정해요. 이 옵션은 고정된 답장 큐(temporary가 아닌)를 쓸 때만 적용돼요. Camel의 기본값은 exclusive 큐나 replyToSelectorName이 있는 shared 큐에는 CACHE_CONSUMER, replyToSelectorName이 없는 shared 큐에는 CACHE_SESSION이에요. IBM WebSphere 같은 일부 JMS 브로커는 동작하려면 replyToCacheLevelName=CACHE_NONE을 설정해야 할 수도 있어요. 참고: temporary 큐를 쓸 때는 CACHE_NONE이 허용되지 않으니 CACHE_CONSUMER나 CACHE_SESSION 같은 더 높은 값을 써야 해요. |

Enum values:

  • CACHE_AUTO

  • CACHE_CONNECTION

  • CACHE_CONSUMER

  • CACHE_NONE

  • CACHE_SESSION

| | String | | replyToDestinationSelectorName (producer (advanced)) | 고정된 이름으로 JMS 셀렉터를 지정해서, 공유 큐를 쓸 때(즉 temporary 답장 큐를 쓰지 않을 때) 다른 사람의 답장은 걸러내고 내 답장만 받을 수 있게 해줘요. | | String | | streamMessageTypeEnabled (producer (advanced)) | StreamMessage 타입을 쓸지 여부예요. 파일, InputStream 같은 스트리밍 성격의 페이로드는 BytesMessage나 StreamMessage로 보내지는데, 이 옵션이 어느 쪽을 쓸지 정해요. 기본은 BytesMessage라서 페이로드 전체가 메모리로 읽혀야 해요. 이 옵션을 켜면 페이로드가 조각(chunk) 단위로 메모리에 읽히고, 각 조각이 데이터가 끝날 때까지 StreamMessage에 기록돼요. | false | boolean | | allowSerializedHeaders (advanced) | 직렬화된 헤더를 포함할지 여부예요. transferExchange가 true일 때만 적용되고, 객체가 직렬화 가능해야 해요. Camel은 직렬화할 수 없는 객체는 제외하고 WARN 레벨로 기록해요. | false | boolean | | artemisStreamingEnabled (advanced) | Apache Artemis 스트리밍 모드에 맞게 최적화할지 여부예요. Artemis에서 JMS StreamMessage 타입을 쓸 때 메모리 오버헤드를 줄일 수 있어요. Apache Artemis를 쓸 때만 켜야 하는 옵션이에요. | false | boolean | | asyncStartListener (advanced) | 라우트를 시작할 때 JmsConsumer 메시지 리스너를 비동기로 시작할지 여부예요. 예컨대 JmsConsumer가 원격 JMS 브로커에 커넥션을 못 얻으면 재시도나 fail-over를 하면서 막힐 수 있고, 그러면 Camel이 라우트를 시작하느라 같이 막혀요. 이 옵션을 true로 하면 JmsConsumer가 전용 스레드로 비동기 모드로 브로커에 연결하는 동안에도 라우트가 뜰 수 있어요. 다만 커넥션을 결국 못 맺으면 WARN 레벨로 예외가 기록되고 컨슈머는 메시지를 받지 못하니, 라우트를 다시 시작해서 재시도해야 해요. | false | boolean | | asyncStopListener (advanced) | 라우트를 멈출 때 JmsConsumer 메시지 리스너를 비동기로 멈출지 여부예요. | false | boolean | | browseLimit (advanced) | 브라우징할 수 있도록 메모리에 유지하는 메시지의 최대 개수예요. 0이면 무제한이에요. | 100 | int | | destinationResolver (advanced) | 자체 resolver를 쓸 수 있게 해주는 pluggable org.springframework.jms.support.destination.DestinationResolver예요(예: JNDI 레지스트리에서 실제 목적지를 찾는 용도). | | DestinationResolver | | errorHandler (advanced) | 메시지 처리 중 잡히지 않은 예외가 던져졌을 때 호출되는 org.springframework.util.ErrorHandler를 지정해요. errorHandler를 설정하지 않으면 기본으로 이런 예외는 WARN 레벨로 기록돼요. errorHandlerLoggingLevel과 errorHandlerLogStackTrace 옵션으로 로깅 레벨과 스택 트레이스 기록 여부를 조절할 수 있어요. 커스텀 errorHandler를 직접 짜는 것보다 훨씬 간단하게 설정할 수 있죠. | | ErrorHandler | | exceptionListener (advanced) | 기반이 되는 JMS 예외가 발생했을 때 통지받을 JMS Exception Listener를 지정해요. | | ExceptionListener | | headerFilterStrategy (advanced) | Camel 메시지의 헤더를 걸러낼 때 쓰는 커스텀 org.apache.camel.spi.HeaderFilterStrategy를 지정해요. | | HeaderFilterStrategy | | idleConsumerLimit (advanced) | 어느 시점이든 idle로 있을 수 있는 컨슈머 수의 상한을 지정해요. | 1 | int | | idleReceivesPerTaskLimit (advanced) | 지정한 횟수의 idle receive에 도달하면 컨슈머를 idle로 표시해요. idle receive는 설정된 setReceiveTimeout이 지난 뒤 receiver가 null 메시지를 돌려준 순간부터 세어요. 이 덕분에 idle task 수가 setIdleTaskExecutionLimit를 넘었는지 확인해서, 그에 따라 작업을 다시 스케줄링할지 말지 결정하고 자원을 아낄 수 있어요. 이 설정은 이 한계에 도달하면 메시지가 null이었든 아니든 작업을 해제하고 다시 스케줄링하는 setMaxMessagesPerTask와 달라요. 작업마다 충분히 큰 배치를 유지하고 싶은데 더는 처리할 메시지가 없어지는 순간에는 빨리 해제되길 원한다면, 이 설정만으로는 유연하지 않을 수 있어요. 또한 이 설정은 몇 번 idle로 표시된 후 작업을 해제할지 정하는 setIdleTaskExecutionLimit와도 달라요. 예컨대 setMaxMessagesPerTask가 '500'이고 #setIdleReceivesPerTaskLimit가 '60'이고 setReceiveTimeout이 '1000'이고 setIdleTaskExecutionLimit가 '1'이면, 이후 60개의 idle 메시지를 받지 않는 한 작업마다 500개 메시지가 처리되고, 60개 idle 메시지를 받으면 작업이 idle로 표시되어 해제돼요. 이는 마지막 메시지가 처리된 뒤 새 메시지가 오지 않는 한 60초 후에 작업이 해제된다는 뜻이기도 해요. | | int | | idleTaskExecutionLimit (advanced) | 실행 중 아무 메시지도 받지 못한 receive 작업의 idle 실행 상한이에요. 이 상한에 도달하면 작업이 종료되고 (동적 스케줄링이라면, maxConcurrentConsumers 설정 참고) 수신을 다른 실행 중인 작업에 넘겨요. Spring에서 추가 문서를 제공하니 참고하세요. | 1 | int | | includeAllJMSXProperties (advanced) | JMS에서 Camel Message로 매핑할 때 JMSX 접두사 속성을 전부 포함할지 여부예요. true로 하면 JMSXAppID, JMSXUserID 같은 속성도 포함돼요. 참고: 커스텀 headerFilterStrategy를 쓰면 이 옵션은 적용되지 않아요. | false | boolean | | jmsKeyFormatStrategy (advanced) | JMS 키를 인코딩/디코딩해서 JMS 스펙을 지키도록 해주는 pluggable 전략이에요. Camel은 default와 passthrough 두 구현체를 기본 제공해요. default 전략은 점과 하이픈(.과 -)을 안전하게 마샬링하고, passthrough 전략은 키를 그대로 둬요. JMS 헤더 키에 잘못된 문자가 있어도 신경 쓰지 않는 JMS 브로커에 쓸 수 있어요. org.apache.camel.component.jms.JmsKeyFormatStrategy를 직접 구현해서 # 표기법으로 참조할 수도 있어요. |

Enum values:

  • default

  • passthrough

| | JmsKeyFormatStrategy | | mapJmsMessage (advanced) | Camel이 받은 JMS 메시지를 적절한 페이로드 타입으로 자동 매핑할지 지정해요. 예컨대 jakarta.jms.TextMessage를 String으로 바꾸는 식이에요. | true | boolean | | maxMessagesPerTask (advanced) | 작업당 처리할 메시지 수예요. -1이면 무제한이에요. 동시 컨슈머에 범위(min max)를 쓰면, 이 옵션을 예컨대 100으로 지정해서 일이 줄어들 때 컨슈머가 얼마나 빨리 줄어들지 조절할 수 있어요. | -1 | int | | messageConverter (advanced) | 커스텀 Spring org.springframework.jms.support.converter.MessageConverter를 써서 jakarta.jms.Message와의 매핑을 직접 통제할 수 있어요. | | MessageConverter | | messageCreatedStrategy (advanced) | Camel이 JMS 메시지를 보낼 때 jakarta.jms.Message 객체의 새 인스턴스를 만들 때마다 호출되는 MessageCreatedStrategy를 사용해요. | | MessageCreatedStrategy | | messageIdEnabled (advanced) | 보낼 때 메시지 ID를 붙일지 지정해요. 이건 JMS 브로커에게 주는 힌트일 뿐이에요. 프로바이더가 힌트를 받아들이면 이 메시지들의 ID는 null이어야 하고, 힌트를 무시하면 평소처럼 유일한 값이 설정돼요. | true | boolean | | messageListenerContainerFactory (advanced) | 메시지를 소비할 때 어떤 org.springframework.jms.listener.AbstractMessageListenerContainer를 쓸지 정하는 MessageListenerContainerFactory의 레지스트리 ID예요. 이걸 설정하면 consumerType이 자동으로 Custom으로 바뀌어요. | | MessageListenerContainerFactory | | messageTimestampEnabled (advanced) | 메시지를 보낼 때 타임스탬프를 기본으로 넣을지 지정해요. 이것도 JMS 브로커에게 주는 힌트일 뿐이에요. 프로바이더가 힌트를 받아들이면 타임스탬프는 0이어야 하고, 힌트를 무시하면 평소 값이 설정돼요. | true | boolean | | objectMessageEnabled (advanced) | JMS ObjectMessage를 보내고 받는 기능을 켤지 여부예요. Java 객체 직렬화는 잘 알려진 보안 취약점이기 때문에 기본은 꺼져 있어요. 메시지 출처를 신뢰하면서 JMS로 Java 직렬화 객체를 주고받아야 할 때만 켜세요. 꺼져 있으면 Camel은 JMS ObjectMessage 인스턴스를 만들거나 읽는 걸 거부해요. transferExchange와 transferException처럼 내부적으로 ObjectMessage에 의존하는 옵션들은 이 옵션이 켜져 있어야 동작해요. | false | boolean | | pubSubNoLocal (advanced) | 자기 커넥션이 발행한 메시지의 전달을 막을지 지정해요. | false | boolean | | receiveTimeout (advanced) | 메시지를 받을 때의 타임아웃(밀리초)이에요. | 1000 | long | | recoveryInterval (advanced) | 커넥션을 새로 맺는 등 복구 시도 사이의 간격(밀리초)이에요. 기본값은 5000ms, 즉 5초예요. | 5000 | long | | requestTimeoutCheckerInterval (advanced) | JMS 위에서 request/reply를 할 때 Camel이 타임아웃된 Exchange를 얼마나 자주 확인할지 설정해요. 기본은 1초에 한 번이에요. 타임아웃에 더 빨리 반응해야 한다면 이 간격을 줄여서 더 자주 확인하게 만들 수 있어요. 타임아웃 값은 requestTimeout 옵션으로 정해져요. | 1000 | long | | synchronous (advanced) | 동기 처리를 엄격하게 강제할지 지정해요. | false | boolean | | temporaryQueueResolver (advanced) | temporary 큐를 만들 때 자체 resolver를 쓸 수 있게 해주는 pluggable TemporaryQueueResolver예요(temporary 큐 생성에 특별한 요구사항을 두는 메시징 시스템도 있어요). | | TemporaryQueueResolver | | transferException (advanced) | 켜두고 Request Reply 메시징(InOut)을 쓰는데 컨슈머 쪽에서 Exchange가 실패하면, 발생한 예외가 jakarta.jms.ObjectMessage로 답장에 실려 돌아와요. 클라이언트가 Camel이면 돌아온 예외를 다시 던져요. 덕분에 Camel JMS를 라우팅의 브리지로 쓸 수 있어요. 예컨대 persistent 큐로 견고한 라우팅을 하는 식이죠. transferExchange도 켜져 있으면 이 옵션이 우선한다는 점을 유의하세요. 잡은 예외는 직렬화 가능해야 하고, 컨슈머 쪽의 원본 예외는 프로듀서로 돌아올 때 org.apache.camel.RuntimeCamelException 같은 바깥 예외로 감싸질 수 있어요. 데이터가 Java 객체 직렬화를 쓰고 받는 쪽이 클래스 수준에서 역직렬화할 수 있어야 해서 프로듀서와 컨슈머가 강하게 결합되니, 이 옵션은 신중하게 쓰세요. | false | boolean | | transferExchange (advanced) | body와 헤더만이 아니라 exchange 전체를 네트워크로 전송할 수 있어요. 전송되는 필드는 In body, Out body, Fault body, In headers, Out headers, Fault headers, exchange 속성, exchange 예외예요. 객체가 직렬화 가능해야 하고, Camel은 직렬화할 수 없는 객체는 제외하며 WARN 레벨로 기록해요. 프로듀서와 컨슈머 양쪽에서 이 옵션을 켜야 Camel이 페이로드를 일반 payload가 아니라 Exchange로 인식해요. 데이터가 Java 객체 직렬화를 쓰고 받는 쪽이 클래스 수준에서 역직렬화할 수 있어야 해서 프로듀서와 컨슈머가 호환되는 Camel 버전을 쓰도록 강하게 결합되니, 신중하게 쓰세요. | false | boolean | | useMessageIDAsCorrelationID (advanced) | InOut 메시지에서 JMSMessageID를 항상 JMSCorrelationID로 쓸지 지정해요. | false | boolean | | waitForProvisionCorrelationToBeUpdatedCounter (advanced) | JMS 위에서 request/reply를 하면서 useMessageIDAsCorrelationID 옵션이 켜져 있을 때, 임시 상관 id가 실제 상관 id로 갱신되기를 기다리는 횟수예요. | 50 | int | | waitForProvisionCorrelationToBeUpdatedThreadSleepingTime (advanced) | 임시 상관 id가 갱신되기를 기다리는 동안 매번 대기하는 간격(밀리초)이에요. | 100 | long | | waitForTemporaryReplyToToBeUpdatedCounter (advanced) | JMS 위에서 request/reply를 할 때 temporary replyTo 큐가 만들어져 준비되기를 기다리는 횟수예요. | 200 | int | | waitForTemporaryReplyToToBeUpdatedThreadSleepingTime (advanced) | temporary replyTo 큐가 준비되기를 기다리는 동안 매번 대기하는 간격(밀리초)이에요. | 100 | long | | errorHandlerLoggingLevel (logging) | 잡히지 않은 예외를 기록할 때 기본 errorHandler의 로깅 레벨을 설정할 수 있어요. |

Enum values:

  • TRACE

  • DEBUG

  • INFO

  • WARN

  • ERROR

  • OFF

| WARN | LoggingLevel | | errorHandlerLogStackTrace (logging) | 기본 errorHandler가 스택 트레이스를 기록할지 여부를 조절할 수 있어요. | true | boolean | | deserializationFilter (security) | jakarta.jms.ObjectMessage.getObject()가 돌려주는 body의 클래스에 심층 방어(defense-in-depth) 확인으로 적용하는 ObjectInputFilter 패턴(jdk.serialFilter 문법)이에요. 이 패턴은 JMS 프로바이더가 페이로드를 역직렬화한 뒤에 평가되므로, 이 옵션만으로는 프로바이더의 ObjectInputStream 안에서 일어나는 gadget-chain 실행을 막을 수 없어요. 그런 공격을 차단하려면 JMS 프로바이더 자체의 역직렬화 필터나 JVM 전역 -Djdk.serialFilter도 함께 설정하세요. 이 옵션을 설정하지 않고 JVM 전역 필터도 없으면, java.net.은 거부하고 java., javax., org.apache.camel.은 허용하는 보수적인 기본 필터가 적용돼요. | | String | | password (security) | ConnectionFactory에서 쓸 비밀번호예요. username/password를 ConnectionFactory에 바로 설정할 수도 있어요. | | String | | username (security) | ConnectionFactory에서 쓸 사용자 이름이에요. username/password를 ConnectionFactory에 바로 설정할 수도 있어요. | | String | | transacted (transaction) | transacted 모드를 쓸지 지정해요. | false | boolean | | transactedInOut (transaction) | InOut 연산(request reply)이 기본으로 transacted 모드를 쓸지 지정해요. 이 플래그를 true로 하면 InOut에 쓰는 Spring JmsTemplate은 sessionTransacted가 true가 되고 acknowledgeMode가 transacted가 돼요. Spring JMS 참고: JTA 트랜잭션 안에서는 createQueue, createTopic 메서드에 넘기는 파라미터가 반영되지 않아요. Java EE 트랜잭션 컨텍스트에 따라 컨테이너가 이 값들을 스스로 결정하거든요. 마찬가지로 로컬 관리 트랜잭션 안에서도 이 파라미터는 반영되지 않는데, 이 경우 Spring JMS는 기존 JMS Session 위에서 동작하기 때문이에요. 이 플래그를 true로 하면 관리 트랜잭션 밖에서는 짧은 로컬 JMS 트랜잭션을, (XA가 아닌) 관리 트랜잭션이 있으면 동기화된 로컬 JMS 트랜잭션을 써요. 그 결과 로컬 JMS 트랜잭션이 메인 트랜잭션(native JDBC 트랜잭션일 수도 있어요)과 함께 관리되고, JMS 트랜잭션은 메인 트랜잭션 직후에 커밋돼요. | false | boolean | | lazyCreateTransactionManager (transaction (advanced)) | true면 transacted=true인데 주입된 transactionManager가 없을 때 Camel이 JmsTransactionManager를 만들어요. | true | boolean | | transactionManager (transaction (advanced)) | 사용할 Spring 트랜잭션 매니저예요. | | PlatformTransactionManager | | transactionName (transaction (advanced)) | 사용할 트랜잭션의 이름이에요. | | String | | transactionTimeout (transaction (advanced)) | transacted 모드를 쓸 때 트랜잭션의 타임아웃 값(초)이에요. | -1 | int |

Message Headers

AMQP 컴포넌트는 다음과 같은 메시지 헤더들을 지원해요:

Name Description Default Type
CamelJmsDestination (producer) Constant: JMS_DESTINATION 목적지예요. Destination
CamelJmsDestinationName (producer) Constant: JMS_DESTINATION_NAME 목적지로 쓸 큐나 토픽의 이름이에요. String
CamelJMSDestinationProduced (common) Constant: JMS_DESTINATION_NAME_PRODUCED 메시지가 보내진 큐나 토픽의 이름이에요. String
JMSXGroupID (common) Constant: JMS_X_GROUP_ID JMS 그룹 ID예요. String
JMSMessageID (common) Constant: JMS_HEADER_MESSAGE_ID JMS 유니크 메시지 ID예요. String
JMSCorrelationID (common) Constant: JMS_HEADER_CORRELATION_ID JMS 상관(correlation) ID예요. String
JMSCorrelationIDAsBytes (common) Constant: JMS_HEADER_CORRELATION_ID_AS_BYTES 바이트 형태의 JMS 상관(correlation) ID예요. byte[]
JMSDeliveryMode (common) Constant: JMS_HEADER_DELIVERY_MODE JMS 전달 모드예요. int
JMSDestination (common) Constant: JMS_HEADER_DESTINATION JMS 목적지예요. Destination
JMSExpiration (common) Constant: JMS_HEADER_EXPIRATION JMS 만료(expiration) 값이에요. long
JMSPriority (common) Constant: JMS_HEADER_PRIORITY JMS 우선순위예요(0이 가장 낮고 9가 가장 높아요). int
JMSRedelivered (common) Constant: JMS_HEADER_REDELIVERED JMS 메시지가 재전달된 것인지 여부예요. boolean
JMSTimestamp (common) Constant: JMS_HEADER_TIMESTAMP JMS 타임스탬프예요. long
JMSReplyTo (common) Constant: JMS_HEADER_REPLY_TO JMS 답장(reply-to) 목적지예요. Destination
JMSType (common) Constant: JMS_HEADER_TYPE JMS 타입이에요. String
JMSXUserID (common) Constant: JMS_HEADER_XUSER_ID XUser id예요. String
CamelJmsMessageType (common) Constant: JMS_MESSAGE_TYPE 메시지 타입이에요.

Enum values:

  • Bytes

  • Map

  • Object

  • Stream

  • Text

  • Blob

| | JmsMessageType | | CamelJmsRequestTimeout (producer) Constant: JMS_REQUEST_TIMEOUT | InOut Exchange 패턴을 쓸 때 답장을 기다리는 타임아웃(밀리초)이에요. | 20000 | long |

Usage

AMQP 컴포넌트는 JMS 컴포넌트를 물려받았기 때문에, 쓰는 방법이 거의 같아요:

AMQP 컴포넌트 사용하기

Java 전용: Java DSL 조각(불완전한 라우트)

// Consuming from AMQP queue
from("amqp:queue:incoming").
  to(...);

// Sending messages to the AMQP topic
from(...).
  to("amqp:topic:notify");

AMQP 컴포넌트 설정하기

AMQP 1.0 컴포넌트 만들기

AMQPComponents는 제공되는 팩토리 메서드로 만들 수 있어요. 예컨대:

Java 전용: Java 프로그래밍 방식의 컴포넌트 팩토리

AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672");

AMQPComponent authorizedAmqp = AMQPComponent.amqpComponent("amqp://localhost:5672", "user", "password");

또는 SSL, 인증, AMQP 브로커 호스트와 포트를 구성할 수 있는 옵션들 중 하나 이상을 제공해서 AMQP 컴포넌트를 초기화할 수도 있어요.

SSL 설정

useSsl 옵션을 설정하고 키스토어와 트러스트스토어 정보를 제공하면, SSL로 AMQP 브로커에 접속하도록 컴포넌트를 구성할 수 있어요. 예컨대:

Java 전용: Java 프로그래밍 방식의 SSL 설정

AMQPComponent component = new AMQPComponent();
component.setUseSsl(true);
component.setTrustStoreLocation(
        getClass().getClassLoader().getResource("server-ca-truststore.p12").getFile());
component.setTrustStorePassword("securepass");
component.setTrustStoreType("PKCS12");
component.setKeyStoreLocation(
        getClass().getClassLoader().getResource("server-keystore.p12").getFile());
component.setKeyStorePassword("securepass");
component.setKeyStoreType("PKCS12");

인증 설정

AMQP 브로커 인증을 위해 사용자 이름과 비밀번호를 제공할 수도 있어요:

Java 전용: Java 프로그래밍 방식의 컴포넌트 설정

AMQPComponent component = new AMQPComponent();
component.setUsername("camel");
component.setPassword("rider");

AMQP 브로커 호스트와 포트 설정

Java 전용: Java 프로그래밍 방식의 컴포넌트 설정

AMQPComponent amqpComponent = new AMQPComponent();
amqpComponent.setHost("remoteHost");
amqpComponent.setPort(5555);

host나 port 옵션이 주어지지 않은 상태에서 다른 옵션들 중 하나 이상으로 컴포넌트를 초기화하면, AMQP JMSConnectionFactory URI의 호스트는 지정하지 않았을 때 'localhost'로, 포트는 '5672'로 설정돼요.

AMQP 고유 옵션 활성화하기

예컨대 amqp.traceFrames를 켜야 한다면, 아래 예시처럼 옵션을 URI 뒤에 붙여서 켤 수 있어요:

Java 전용: Java 프로그래밍 방식의 컴포넌트 팩토리

AMQPComponent amqp = AMQPComponent.amqpComponent("amqp://localhost:5672?amqp.traceFrames=true");

참고로 QPID JMS 클라이언트 설정 문서를 살펴보세요.

토픽 사용하기

camel-amqp에서 토픽을 쓰려면 아래처럼 컴포넌트가 topic://를 토픽 접두사로 쓰도록 설정해야 해요:

 <bean id="amqp" class="org.apache.camel.component.amqp.AmqpComponent">
   <property name="connectionFactory">
     <bean class="org.apache.qpid.jms.JmsConnectionFactory" factory-method="createFromURL">
       <property name="remoteURI" value="amqp://localhost:5672" />
       <property name="topicPrefix" value="topic://" />  <!-- only necessary when connecting to ActiveMQ over AMQP 1.0 -->
     </bean>
   </property>
 </bean>

팩토리 메서드 AMQPComponent#amqpComponent(String)과 AMQPComponent#amqpComponent(String, String, String)은 토픽 접두사를 기본으로 topic://로 설정하기 때문에, 굳이 명시적으로 설정하지 않아도 돼요.

더 알아보기 (Learn more)

  • AMQP 컴포넌트는 JMS 컴포넌트를 상속하므로 JMS 문서의 사용법·옵션 설명이 대부분 그대로 적용돼요. JMS 컴포넌트 문서를 함께 보세요.
  • SSL·인증·브로커 연결 설정은 위의 Configuring AMQP component 섹션 예제 코드를 따라 해 보고, 더 깊은 옵션은 QPID JMS 클라이언트 설정 문서를 확인하세요.
  • ActiveMQ를 AMQP 1.0으로 연결할 때는 토픽 접두사 topic:// 설정이 필요할 수 있으니 Using topics 섹션을 참고하세요.