307.6.5. transacted Batch Consumers & Producers

SJMS2 구성 요소는 Producer 및 Consumer 끝점 모두에서 로컬 JMS 트랜잭션 배치를 지원하도록 설계되었습니다. 그러나 각각 어떻게 처리되는지는 매우 다릅니다.

SJMS2 소비자 끝점은 연결된 세션으로 커밋하기 전에 X 메시지를 처리하는 간단한 구현입니다. 소비자에서 배치된 트랜잭션을 사용하려면 먼저 transacted 매개 변수를 true로 설정한 다음 transactionBatchCount 를 추가하고 0보다 큰 값으로 설정하여 트랜잭션을 활성화합니다. 예를 들어 다음 구성은 10개의 메시지마다 세션을 커밋합니다.

sjms2:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10

소비자 끝점에서 배치를 처리하는 동안 예외가 발생하면 세션 롤백이 호출되어 메시지가 다음 사용 가능한 소비자로 재전송됩니다. 또한 카운터는 연결된 세션의 BatchTransactionCommitStrategy 에 대해 0으로 설정됩니다. 사용자가 JMSRedelivered 헤더가 true로 설정된 메시지를 조사하기 위해 배치 메시지의 프로세서에 후크를 배치해야 합니다. 이는 메시지가 어느 시점에서 롤백되었으며 성공적인 처리 확인이 발생했음을 나타냅니다.

트랜잭션된 배치 소비자는 또한 세션에서 열려 있는 트랜잭션을 커밋하기 전에 메시지 간에 기본 시간(5000ms)을 대기하는 내부 타이머의 인스턴스를 전달합니다. 기본적으로 5000ms(최소 1000ms)는 대부분의 사용 사례에 적합하지만 추가 튜닝이 필요한 경우 transactionBatchTimeout 매개변수를 설정합니다.

sjms2:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000

컨텍스트 전환의 양이 예기치 않은 성능이 저하될 수 있으므로 허용되는 최소 값은 1000ms입니다.

그러나 생산자 끝점은 훨씬 다르게 처리됩니다. 각 메시지가 대상에 전달된 후 생산자를 사용하면 Exchange가 종료되고 더 이상 해당 메시지에 대한 참조가 없습니다. 모든 메시지를 재전송에 사용할 수 있도록 하려면 BatchMessages를 게시하는 Producer Endpoint에서 트랜잭션을 활성화하기만 하면 됩니다. 트랜잭션은 배치 목록에 있는 모든 메시지를 포함하는 교환의 결론에 커밋됩니다. 추가 구성을 수행할 필요가 없습니다. 예를 들면 다음과 같습니다.

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}

이제 트랜잭션이 활성화된 목록을 게시합니다.

template.sendBody("sjms2:queue:batch.queue?transacted=true", messages);