2017-12-09 1 views
0

분산 메시지 대기열에 Camel을 사용하는 방법은 무엇입니까? 기본적으로 나는 세 개의 서비스로 구성된 시스템을 가지고 있는데, 여기서 A는 SOAP 클라이언트에 대한 동기식 경계입니다. A는 서비스 C 을 얻지 만 대신 서비스 B에서 결과를 얻습니다.. 고 가용성을 보장하기 위해 각 서비스의 여러 인스턴스가 실행됩니다.Apache Camel 및 JMS 클러스터 (분산 대기열)

요청에 대한 결과가 호출 된 것보다 다른 서비스에서 왔기 때문에 비동기 메시징 (메시지 대기열)을 사용해야합니다 (C는 B의 결과 집합을 얻을 수 없으므로 A 결과 집합도 C가 될 수 없습니다. 동시 적으로 연결되지 않음). 가장 큰 문제는 응답 메시지를 올바른 인스턴스/스레드로 라우팅하는 것입니다 (A는 동기 서비스이며 결과를 얻을 때까지 차단됨). 연구를 수행 한 후에 JMS는 다음과 같은 두 가지 방법을 제공한다고 생각했습니다. JMSCorrelationIDJMSReplyTo 헤더. 낙타는 이러한 헤더를 투명하게 처리하는 것으로 보입니다.

enter image description here

은 그러나 더 큰 문제가있다. 물론 높은 가용성을 보장하기 위해 메시지 대기열의 인스턴스를 여러 번 실행해야합니다. 메시지 큐가 다운되면 시스템을 계속 사용할 수 있습니다.

어떤 종류의 지원 카멜은 분산 대기열에 즉시 사용할 수 있습니까? Weblogic에서 JMS 클러스터을 구성하고이를 Camel에서 활용하고 싶다고 가정 해 보겠습니다. 어떤 특별한 구성이 필요합니까? 이 예에서 우리는 비밀 결과 및 결과 메시지가 동일한 대기열 또는 서버 인스턴스에서 명상 될 수 없기 때문에 두 개의 서로 다른 대기열 (또는 대기열 클러스터)을 사용하지만 메시지 간의 상관 관계는 항상 유지되어야합니다.

+0

매우 복잡한 요구 사항이 있습니다. 필자는 Camel이 통합이 아닌 애플리케이션이어야하는 것처럼 들리므로 여기에 필요한 것이 무엇인지 확신 할 수 없습니다. 그러나 Camel을 사용하기를 원한다면 [recipientList] (http://camel.apache.org/recipient-list.html)를 사용하여 수신 JMS 대기열 (및 브로커, 나는 추측 할 수 있음)을 설정할 수 있다고 생각합니다. 런타임 중 일부 계산. – noMad17

답변

0

상관 ID를 사용해 보셨습니까? 이 같은

뭔가 :

from("direct:myCall") 
.setProperty("myCorrelationId", constant("1")) 
.setBody(constant("MESSAGE")) 
.to("socket-tcp://SOCKET:16010") 
.toD("direct:aggregator") 
.end(); 

from("direct:aggregator") 
.aggregate(property("myCorrelationId"),(oldExchange, newExchange) -> { 
    if(oldExchange != null) { 
     /*do somenthing*/ 
    } 
    if(newExchange != null) { 
     /*Do something*/ 
    } 
    return newExchange; 
}).eagerCheckCompletion().completionSize(2) 
.to("log:foo") 
.end(); 

이 예에서 당신은 상관 관계 ID와이 정보를 사용하여 작업 같은 상관 관계 ID 2 메시지를 기다립니다 집계 경로로 전화를해야합니다.

관련 문제