11.7. Cryostat 구독자
11.7.1. 개요
그림 11.6. “Cryostat 구독자 패턴” 에 표시된 대로 지속성 구독자 는 소비자가 메시징 시스템에서 연결이 끊긴 동안 전송된 메시지를 포함하여 특정 6.2절. “게시-서브스크립션 채널” 채널을 통해 전송되는 모든 메시지를 수신하려는 소비자입니다. 이를 위해서는 메시징 시스템이 연결이 끊긴 소비자로 나중에 재생하기 위한 메시지를 저장해야 합니다. 또한 소비자가 기존 서브스크립션을 구축하고자 한다는 것을 나타내는 메커니즘이 있어야 합니다. 일반적으로 게시-구독 채널(또는 topic)은 다음과 같이 작동합니다.
- 비독일 수 있는 구독자 으며 연결 및 연결이 끊어진 두 가지 상태가 있을 수 있습니다. 실행 불가능한 구독자는 주제에 연결되어 있지만 주제의 모든 메시지를 실시간으로 수신합니다. 그러나 실행 불가능한 구독자는 구독자의 연결이 끊어진 동안 해당 주제로 보낸 메시지를 받지 않습니다.
- 강인 구독자 Cryo stat- Cryostat는 두 가지 상태, 즉 연결 및 비활성 상태가 있을 수 있습니다. 비활성 상태는 지속성 구독자가 주제와의 연결이 끊어지지만 임시로 들어오는 메시지를 수신하려는 것을 의미합니다. ity 구독자가 항목에 다시 연결되면 비활성 상태인 동안 전송된 모든 메시지를 재생합니다.
그림 11.6. Cryostat 구독자 패턴
11.7.2. JMS Cryostat 구독자
JMS 구성 요소는 지속성 구독자 패턴을 구현합니다. JMS 끝점에서 Cryostat 서브스크립션을 설정하려면 이 특정 연결을 식별하는 클라이언트 ID 와 Cryo stat 서브스크립션 이름을 지정해야 합니다. 예를 들어 다음 경로는 클라이언트 ID가 conn01
인 JMS 주제, news
에 대한 Cryostat 서브스크립션을 설정하고, audit .Doe의 Cryostat 서브스크립션 이름을 설정합니다.
from("jms:topic:news?clientId=conn01&durableSubscriptionName=John.Doe"). to("cxf:bean:newsprocessor");
ActiveMQ 끝점을 사용하여 Cryostat 서브스크립션을 설정할 수도 있습니다.
from("activemq:topic:news?clientId=conn01&durableSubscriptionName=John.Doe"). to("cxf:bean:newsprocessor");
들어오는 메시지를 동시에 처리하려는 경우 SEDA 끝점을 사용하여 다음과 같이 여러 병렬 세그먼트로 경로를 배포할 수 있습니다.
from("jms:topic:news?clientId=conn01&durableSubscriptionName=John.Doe"). to("seda:fanout"); from("seda:fanout").to("cxf:bean:newsproc01"); from("seda:fanout").to("cxf:bean:newsproc02"); from("seda:fanout").to("cxf:bean:newsproc03");
SEDA 구성 요소가 경쟁 소비자 패턴을 지원하므로 각 메시지가 한 번만 처리되는 경우입니다.
11.7.3. 대체 예
또 다른 대안은 사용할 수 없는 경우 SEDA 의 경우 11.5절. “메시지 Dispatcher” 또는 8.1절. “콘텐츠 기반 라우터” 를 파일 또는 JPA 구성 요소와 결합한 것입니다.
다음은 JMS 주제의 구독자를 생성하는 간단한 예입니다.
from("direct:start").to("activemq:topic:foo"); from("activemq:topic:foo?clientId=1&durableSubscriptionName=bar1").to("mock:result1"); from("activemq:topic:foo?clientId=2&durableSubscriptionName=bar2").to("mock:result2");
<route> <from uri="direct:start"/> <to uri="activemq:topic:foo"/> </route> <route> <from uri="activemq:topic:foo?clientId=1&durableSubscriptionName=bar1"/> <to uri="mock:result1"/> </route> <route> <from uri="activemq:topic:foo?clientId=2&durableSubscriptionName=bar2"/> <to uri="mock:result2"/> </route>
다음은 JMS Cryostat 구독자의 또 다른 예이지만, 이번에는 가상 주제 를 사용합니다(레드 서브스크립션을 통해 AMQ에 의해 권장됨)
Fluent Builders 사용
from("direct:start").to("activemq:topic:VirtualTopic.foo"); from("activemq:queue:Consumer.1.VirtualTopic.foo").to("mock:result1"); from("activemq:queue:Consumer.2.VirtualTopic.foo").to("mock:result2");
<route> <from uri="direct:start"/> <to uri="activemq:topic:VirtualTopic.foo"/> </route> <route> <from uri="activemq:queue:Consumer.1.VirtualTopic.foo"/> <to uri="mock:result1"/> </route> <route> <from uri="activemq:queue:Consumer.2.VirtualTopic.foo"/> <to uri="mock:result2"/> </route>