303장. 간단한 JMS Batch 구성 요소

Camel 버전 2.16에서 사용 가능

SJMS Batch는 JMS 대기열에서 높은 성능의 트랜잭션 배치 사용을 위한 특수 구성 요소입니다. 소비자 전용 구성 요소 및 집계기의 하이브리드로 간주할 수 있습니다.

Camel의 일반적인 사용 사례는 대기열의 메시지를 사용하고 집계된 상태를 다른 끝점으로 보내기 전에 집계하는 것입니다. 처리를 수행하는 시스템이 실패하면 데이터가 손실되지 않도록하기 위해 일반적으로 대기열의 트랜잭션 내에서 사용되고 JDBC 구성 요소에 있는 항목과 같은 영구 AggregationRepository 에 저장된 데이터를 한 번 집계합니다.

집계기 패턴의 동작에는 들어오는 메시지가 집계되기 전에 AggregationRepository 에서 데이터를 가져와서 결과를 다시 작성하는 작업이 포함됩니다. 본질적으로 집계된 아티팩트 수가 증가함에 따라 읽기 및 쓰기가 점진적으로 더 오래 걸립니다. 이 문제의 영향을 보여주는 임의의 시간 단위를 사용하는 대략적인 예는 다음과 같습니다.

item읽기 시간쓰기 시간총 시간

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 가 경로에 전달됩니다. 이 Exchange 를 처리하는 동안 예외가 throw되거나 시스템이 종료되면 원래 사용된 모든 메시지가 대기열에 백업됩니다(또는 브로커 구성에 따라 dead-letter 큐에 위치).

일반 집계기를 사용하는 것과는 달리 집계 조건을 위한 기능이 없으므로 여러 메시지 그룹에 배치할 수 없습니다. 사용된 모든 메시지는 단일 일괄 처리로 집계됩니다.

하나의 경로를 사용하여 병렬로 사용할 수 있는 여러 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>

303.1. URI 형식

sjms:[queue:]destinationName[?options]

여기서 destinationName 은 JMS 대기열입니다. 기본적으로 destinationName 은 큐 이름으로 해석됩니다.

sjms:FOO.BAR

원하는 경우 선택적 queue: 접두사를 포함할 수 있습니다.

sjms:queue:FOO.BAR

해당 컨텍스트 내에서 배치 소비를 사용할 수 없기 때문에 주제 소비는 지원되지 않습니다. 주제 메시지는 일반적으로 비영구적이며, 손실은 허용됩니다. 실패하는 트랜잭션 내에서 사용하는 경우 브로커에 의해 주제 메시지를 재전송하지 않을 수 있습니다. 일반 SJMS 소비자 끝점을 이 시나리오에서 일반 비일리어 지원 집계기와 함께 사용할 수 있습니다.