306장. 간단한 JMS 배치 구성 요소
Camel 버전 2.16에서 사용 가능
SJMS Batch는 JMS 대기열에서 고성능 트랜잭션 일괄 처리를 위한 특수 구성 요소입니다. 이는 소비자 전용 구성 요소 및 집계기의 하이브리드로 간주할 수 있습니다.
Camel의 일반적인 사용 사례는 큐의 메시지를 사용하고 집계된 상태를 다른 엔드포인트로 보내기 전에 집계한 메시지를 집계하는 것입니다. 처리를 수행하는 시스템이 실패하면 데이터가 손실되지 않도록 하기 위해 일반적으로 대기열의 트랜잭션 내에서 사용되며 JDBC 구성 요소에 있는 것과 같은 영구 집계Repository
에 저장됩니다.
수집기 패턴의 동작은 들어오는 메시지가 집계되기 전에 AggregationRepository
에서 데이터를 가져와서 나중에 결과를 다시 작성하는 것입니다. 기본적으로 집계된 아티팩트 수가 증가함에 따라 읽기 및 쓰기가 점진적으로 더 오래 걸립니다. 이 문제의 영향을 보여주는 임의의 시간 단위를 사용하는 대략적인 예는 다음과 같습니다.
항목 | 읽기 시간 | 쓰기 시간 | 총 시간 |
---|---|---|---|
0 | 0 | 1 | 1 |
1 | 1 | 2 | 4 |
2 | 2 | 3 | 9 |
3 | 3 | 4 | 16 |
4 | 4 | 5 | 25 |
5 | 5 | 6 | 36 |
6 | 6 | 7 | 49 |
7 | 7 | 8 | 64 |
8 | 8 | 9 | 81 |
9 | 9 | 10 | 100 |
반면 SJMS Batch 구성 요소를 사용한 소비 성능은 선형입니다. 각 메시지는 다음 메시지를 가져오기 전에 AggregationStrategy
를 사용하여 사용하고 집계합니다. 단일 JMS 트랜잭션에서 모든 사용 및 집계가 수행되므로 중간 상태를 유지하기 위해 외부 스토리지가 필요하지 않습니다. 이는 위에서 설명한 읽기 및 쓰기 비용을 방지합니다. 실제로 이로 인해 처리량이 많은 여러 주문이 발생합니다.
첫 번째 메시지 이후의 크기 또는 마침표로 완료 조건이 충족되면 집계 된
교환이 경로로 전달됩니다. 이 Exchange
를 처리하는 동안 예외가 발생하거나 시스템이 종료되면 모든 원래 소비된 메시지는 큐에 다시 끝납니다(또는 브로커 구성에 따라 dead-letter queue에 배치됨).
일반 집계기를 사용하는 것과 달리 집계 조건에 대한 기능이 없으므로 여러 메시지 그룹에 배치를 사용할 수 없습니다. 사용되는 모든 메시지는 단일 일괄 처리로 집계됩니다.
하나의 경로를 사용하여 병렬로 사용할 수 있는 여러 JMS 소비자 지원을 사용할 수 있으며, 동시에 JMS 메시지 그룹과 같은 기능을 사용하여 관련 메시지를 그룹화할 수 있습니다.
Maven 사용자는 이 구성 요소에 대해 pom.xml
에 다음 종속성을 추가해야 합니다.
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-sjms</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
306.1. URI 형식
sjms:[queue:]destinationName[?options]
여기서 destinationName
은 JMS 대기열입니다. 기본적으로 destinationName
은 큐 이름으로 해석됩니다.
sjms:FOO.BAR
원하는 경우 선택적 queue:
접두사를 포함할 수 있습니다.
sjms:queue:FOO.BAR
해당 컨텍스트 내에서 배치 사용을 사용하는 이점이 없으므로 주제 사용은 지원되지 않습니다. 주제 메시지는 일반적으로 비영구적이며 손실은 허용됩니다. 실패한 트랜잭션 내에서 소비된 경우 브로커에 의해 주제 메시지가 다시 전달되지 않을 수 있습니다. 이 시나리오에서는 일반 SJMS 소비자 끝점을 일반 비독점 백업 수집기와 함께 사용할 수 있습니다.