178.14. JMS를 통한 요청


Camel은 Request Reply over JMS를 지원합니다. JMS 대기열에 메시지를 보낼 때 Exchange의 MEP는 InOut 이어야 합니다.

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

Expand
옵션성능Cluster설명

임시

신속 (Fast)

제공됨

임시 대기열은 응답 대기열로 사용되며 Camel에 의해 자동으로 생성됩니다. 이 기능을 사용하려면 replyTo 대기열 이름을 지정하지 않습니다. 임시 큐가 사용 중임을 알 수 있도록 replyToType=Temporary 를 선택적으로 구성할 수 있습니다.

공유

느린

제공됨

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

exclusive

신속 (Fast)

아니요(예:)

전용 영구 큐는 응답 큐로 사용됩니다. 일부 브로커는 사전에 큐를 생성해야 하지만 일부 브로커는 Apache ActiveMQ와 같이 즉시 생성할 수 있습니다. 이를 사용하려면 replyTo 대기열 이름을 지정해야 합니다. 또한 replyTo Type=Exclusive 를 구성하여 Camel에 replyToType=Exclusive가 구성된 경우 기본적으로 Shared 가 사용되므로 전용 대기열을 사용하도록 지시합니다. 전용 응답 대기열을 사용하는 경우 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 이상을 사용하는 경우 concurrentConsumers 옵션을 사용합니다. 아래를 참조하십시오.

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

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

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

178.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번 가져오기 위해 250밀리로 설정할 수 있습니다.

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

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

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

Camel 2.9에서 사용 가능

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

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