179.14. JMS를 통한 요청 처리


Camel은 JMS를 통한 요청 처리 지원. 본질적으로 메시지를 JMS 큐에 보낼 때 Exchange의 MEP가 InOut 이어야 합니다.

Camel은 성능 및 클러스터형 환경에 영향을 미치는 JMS를 통해 요청/응답을 구성할 수 있는 다양한 옵션을 제공합니다. 아래 표는 옵션을 요약합니다.

Expand
옵션성능Cluster설명

임시

신속 (Fast)

제공됨

임시 큐는 응답 큐로 사용되며 Camel에서 자동으로 생성됩니다. 이를 사용하려면 replyTo 큐 이름을 지정하지 않습니다. 그리고 선택적으로 replyToType=Temporary 를 구성하여 임시 큐가 사용 중인지 확인할 수 있습니다.

공유됨

slow

제공됨

공유 영구 대기열은 응답 대기열로 사용됩니다. 일부 브로커는 Apache ActiveMQ와 같은 즉시 생성할 수 있지만 대기열은 사전에 생성해야 합니다. 이를 사용하려면 replyTo 큐 이름을 지정해야 합니다. 또한 선택적으로 replyToType=Shared 를 구성하여 공유 대기열이 사용 중인지 확인할 수 있습니다. 이 Camel 애플리케이션을 실행하는 여러 노드가 있는 클러스터형 환경에서 공유 큐를 동시에 사용할 수 있습니다. 모두 동일한 공유 응답 대기열을 사용합니다. 이는 JMS Message 선택기를 사용하여 예상되는 응답 메시지의 상관 관계를 유지하는 데 사용할 수 있으므로 가능합니다. 이는 성능에 영향을 미칩니다. JMS 메시지 선택기의 속도가 느리기 때문에 임시 또는 Exclusive 대기열만큼 빠르지 않습니다. 더 나은 성능을 위해 이를 조정하는 방법은 아래를 참조하십시오.

exclusive

신속 (Fast)

제공되지 않음 (예)

전용 영구 대기열은 응답 대기열로 사용됩니다. 일부 브로커는 Apache ActiveMQ와 같은 즉시 생성할 수 있지만 대기열은 사전에 생성해야 합니다. 이를 사용하려면 replyTo 큐 이름을 지정해야 합니다. 그리고 replyTo 큐 이름이 구성된 경우 기본적으로 Shared 가 사용되므로 Camel에 전용 대기열을 사용하도록 하려면 replyToType=Exclusive 를 구성해야 합니다. 배타적 응답 대기열을 사용하는 경우 JMS 메시지 선택기를 사용하지 않으므로 다른 애플리케이션도 이 큐를 사용해서는 안 됩니다. 이 Camel 애플리케이션을 실행하는 여러 노드가 있는 클러스터형 환경에서 동시에 사용할 수 없습니다. 응답 대기열이 요청 메시지를 보낸 동일한 노드로 다시 제공되는 경우 제어가 없기 때문에 공유 대기열에서 JMS 메시지 선택기를 사용하여 이를 확인합니다. 노드당 고유한 이름으로 각 Exclusive 응답 큐를 구성하는 경우 클러스터형 환경에서 이를 실행할 수 있습니다. 그러면 응답 메시지가 지정된 노드의 해당 큐로 다시 전송되며, 해당 응답 메시지가 대기됩니다.

concurrentConsumers

신속 (Fast)

제공됨

Camel 2.10.3: 사용 중인 동시 메시지 리스너를 사용하여 응답 메시지를 동시에 처리할 수 있습니다. concurrentConsumersmaxConcurrentConsumers 옵션을 사용하여 범위를 지정할 수 있습니다. 참고: 공유 응답 대기열을 사용하는 경우 동시 리스너도 작동하지 않을 수 있으므로 이 옵션을 주의해서 사용하십시오.

maxConcurrentConsumers

신속 (Fast)

제공됨

Camel 2.10.3: 사용 중인 동시 메시지 리스너를 사용하여 응답 메시지를 동시에 처리할 수 있습니다. concurrentConsumersmaxConcurrentConsumers 옵션을 사용하여 범위를 지정할 수 있습니다. 참고: 공유 응답 대기열을 사용하는 경우 동시 리스너도 작동하지 않을 수 있으므로 이 옵션을 주의해서 사용하십시오.

JmsProducerInOut 을 감지하고 사용할 응답 대상을 사용하여 JMSReplyTo 헤더를 제공합니다. 기본적으로 Camel은 임시 큐를 사용하지만 엔드포인트에서 replyTo 옵션을 사용하여 고정 응답 큐를 지정할 수 있습니다(고정 응답 대기열에 대한 자세한 내용 참조).

Camel은 응답 대기열에서 청취하는 소비자를 자동으로 설정하므로 아무 작업도 수행하지 않아야 합니다.
이 소비자는 응답을 수신 대기하는 Spring DefaultMessageListenerContainer 입니다. 그러나 동시 소비자는 1개로 고정되어 있습니다.
즉, 응답을 처리할 스레드가 1개뿐이므로 응답이 순서대로 처리됩니다. 응답을 더 빠르게 처리하려면 동시성을 사용해야 합니다. 하지만 concurrentConsumer 옵션은 사용하지 않습니다. 아래 경로에 표시된 것처럼 Camel DSL의 스레드 를 대신 사용해야 합니다.

Camel 2.10.3 이상을 사용하는 경우 threads를 사용하는 대신 concurrentConsumers 옵션을 사용합니다. 아래를 참조하십시오.

from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);
Copy to Clipboard Toggle word wrap

이 경로에서는 5개의 스레드가 있는 스레드 풀을 사용하여 비동기식으로 응답을 라우팅하도록 Camel에 지시합니다.

Camel 2.10.3 부터 concurrentConsumersmaxConcurrentConsumers 옵션을 사용하여 동시 스레드를 사용하도록 리스너를 구성할 수 있습니다. 이를 통해 다음과 같이 Camel에서 이 설정을 더 쉽게 구성할 수 있습니다.

from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);
Copy to Clipboard Toggle word wrap

179.14.1. JMS를 통한 요청 및 고정 응답 대기열 사용

아래 예제와 같이 Request Reply over JMS를 수행할 때 고정된 응답 큐를 사용하는 경우 주의하십시오.

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar")
.to(yyy)
Copy to Clipboard Toggle word wrap

이 예제에서는 "bar"라는 고정 응답 큐가 사용됩니다. 기본적으로 Camel은 고정 응답 대기열을 사용할 때 큐가 공유되므로 JMSSelector 를 사용하여 예상 응답 메시지만 가져옵니다(예: JMSCorrelationID). 전용 고정 응답 대기열은 다음 섹션을 참조하십시오. 즉, 임시 큐만큼 빠르지 않습니다. receiveTimeout 옵션을 사용하여 Camel이 응답 메시지를 가져오는 빈도를 단축할 수 있습니다. 기본적으로 1000밀리입니다. 따라서 더 빠르게하려면 다음과 같이 초당 4 번 당 4 번 당 4 밀리를 가져오도록 250 밀리 초로 설정할 수 있습니다.

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250")
.to(yyy)
Copy to Clipboard Toggle word wrap

이로 인해 Camel이 메시지 브로커에 가져오기 요청을 더 자주 보내므로 더 많은 네트워크 트래픽이 필요합니다.
가능한 경우 임시 큐를 사용하는 것이 좋습니다.

179.14.2. JMS를 통해 요청 및 고정 응답 대기열 사용

Camel 2.9에서 사용 가능

이전 예에서 Camel은 "bar"라는 고정된 응답 대기열이 공유될 것으로 예상하므로 JMSSelector 를 사용하여 필요한 응답 메시지만 사용합니다. 그러나 JMS selectos가 느리기 때문에 이를 수행하는 단점이 있습니다. 또한 응답 대기열의 소비자는 새 JMS 선택기 ID로 업데이트하는 속도가 느립니다. 실제로 receiveTimeout 옵션이 시간 초과된 경우에만 업데이트됩니다. 기본적으로 1초입니다. 따라서 이론적으로는 응답 메시지가 감지되기까지 약 1초까지 걸릴 수 있습니다. 반면 고정 응답 대기열이 Camel 응답 소비자 전용인 경우 JMS 선택기를 사용하지 않도록 할 수 있으므로 더 성능이 저하됩니다. 실제로 임시 큐를 사용하는 것만큼 빠릅니다. 따라서 Camel 2.9 이상에서는 아래 예제와 같이 Camel에 응답 대기열이 배타적임을 알 수 있도록 Exclusive
로 구성할 수 있는 ReplyToType 옵션을 도입했습니다.

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)
Copy to Clipboard Toggle word wrap

큐는 각 끝점에 독점적이어야 합니다. 따라서 두 개의 경로가 있는 경우 다음 예에 표시된 대로 각각 고유한 응답 대기열이 필요합니다.

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)

from(aaa)
.inOut().to("activemq:queue:order?replyTo=order.reply&replyToType=Exclusive")
.to(bbb)
Copy to Clipboard Toggle word wrap

클러스터형 환경에서 실행하는 경우에도 마찬가지입니다. 그런 다음 클러스터의 각 노드는 고유한 응답 대기열 이름을 사용해야 합니다. 그렇지 않으면 클러스터의 각 노드가 다른 노드에서 응답하도록 의도된 메시지를 선택할 수 있습니다. 클러스터형 환경의 경우 대신 공유 응답 대기열을 사용하는 것이 좋습니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

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

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat