0

우리는 여러 엔드 포인트 (에이전트)로부터 많은 메시지를받는 간단한 프로젝트를 가지고 있습니다. 이러한 에이전트는 모두 동일한 형식의 메시지 (데이터베이스에 배치 할 엔터티 개체)를 출력합니다. 모든 에이전트는 하나의 큐에 쓰고 우리는 이것을 사용하여 JPA를 통해 데이터베이스로 보냅니다.Apache Camel - JPA 엔드 포인트로 메시지 라우팅 - 순서는 유지하지만 범주 헤더를 기반으로 풀로 분할

기본적으로 시스템에는 하나의 대기열에 메시지를 쓰는 제작자 모음이 있습니다. 대기열은 단일 스레드이며 메시지가 들어 와서 데이터베이스로 덤프합니다.

이 방법의 문제는 느립니다. Camel에서 소스를 기반으로 메시지를 분리하는 데 사용할 수있는 기능 (예 : 재 시퀀싱)이 있습니까? 따라서 Agent1의 메시지가 생성 된 순서대로 유지되어야하는 반면 Agent2의 메시지는 분리되어 있으므로 Agent1의 메시지 순서대로 기다리지 않아야합니다. 두 에이전트의 경우 이는 각 에이전트마다 하나씩 두 개의 대기열을 작성하기 만하면 쉬운 문제입니다. 우리에게는 여러 가지 에이전트가 있으므로 규모를 조정할 수있는 솔루션이 필요합니다.

낙타로이 작업을 수행 할 수있는 패턴이 있습니까? 우리는 에이전트 이름에 동기화 된 자체 유지 대기열을 작성할 수 있으며 하나의 메시지 만 다중 스레드 JPA 쓰기 대기열에 넣을 수 있습니다. 그러나 이것은 우리가 필요로하는 것처럼 일을 수행하는 약간의 방법 일 것입니다 대기열에서 jpa camel route로 콜백을 설정하거나 낙타를 사용하지 않고 자체 관리자를 통해 콜백을 설정합니다 (복잡한 것은 아니지만 Camel 또는 다른 것을 사용하여이 모든 작업을 수행 할 수 있다면 좋을 것입니다.) 바퀴를 재발 명할 필요가 없습니다). 당신 소스가 JMS 메시지 큐이다가, 다음 메시지 그룹을 살펴 경우

답변

1

여기에 대한

아파치 ActiveMQ를 문서 : http://activemq.apache.org/message-groups.html

그리고이 FAQ 기본적으로 http://activemq.apache.org/how-do-i-preserve-order-of-messages.html

사용할 수있는 에이전트 ID를 표시하는 JMSXGroupID JMS 등록 정보 (예 : agent1, agent2 등)

그러면 동시 사용자 JMSXGroupID를 기반으로 병렬로 실행할 수있는 JMS 메시지 대기열에 있습니다. 그러나 각 그룹 내에서 순서를 유지합니다. 즉, JPA agent1, agent2, ... agentN에 병렬로 쓸 수 있음을 의미합니다.

+0

감사합니다. ActiveMQ에 메시지를 보낼 필요없이이 작업을 수행 할 수있는 방법이 있습니까? – NightWolf

+0

예 JMSXGroupID는 모든 JMS 브로커의 일부이므로 WebSphereMQ, OracleAQ, Tibco, Sonic 등에서 작동해야합니다. –