14장. 임시 대기열 및 런타임 대기열

클라이언트에서 요청을 보내고 응답을 대기하는 요청-응답 패턴을 설계할 때 클라이언트의 런타임 인스턴스에 응답 전용 큐가 필요한지 또는 런타임 인스턴스가 공유 큐에 액세스할 수 있는지 여부와 적절한 특성을 기반으로 특정 응답 메시지를 선택해야 합니다.

여러 큐가 필요한 경우 클라이언트는 대기열을 동적으로 만드는 기능이 필요합니다. Jakarta Messaging은 임시 대기열의 개념을 사용하여 이 기능을 제공합니다. TemporaryQueue 는 세션에서 요청 시 생성됩니다. 연결 수명 동안 존재합니다(예: 연결이 닫힐 때까지 또는 임시 큐가 삭제될 때까지). 즉, 특정 세션에서 임시 대기열을 생성하지만 동일한 연결에서 생성된 다른 세션에서 재사용할 수 있습니다.

공유 큐와 응답에 대한 개별 임시 대기열을 사용하는 장단점은 잠재적인 활성 클라이언트 인스턴스 수에 영향을 받습니다. 공유 대기열 접근법에서는 일부 공급자별 임계값에서 큐 액세스에 대한 경합이 문제가 될 수 있습니다. 이는 런타임에 큐 스토리지를 생성하는 공급자와 관련된 추가 오버헤드 및 잠재적으로 많은 임시 대기열을 호스팅하는 시스템 메모리에 미치는 영향과 대조되어야 합니다.

다음 예제에서는 시작 시 각 클라이언트에 대해 임시 대기열 및 소비자를 생성합니다. 각 메시지의 JMSReplyTo 속성을 임시 대기열로 설정한 다음 각 메시지에 상관 관계 ID를 설정하여 요청 메시지를 응답 메시지와 상호 연결합니다. 이렇게 하면 비용이 많이 드는 각 요청의 소비자를 생성 및 종료하는 오버헤드가 방지됩니다. 동일한 생산자 및 소비자는 여러 스레드에서 공유하거나 풀링할 수 있습니다. 세션이 종료될 때 아직 승인되지 않은 메시지가 수신되었지만 아직 승인되지 않은 메시지는 소비자가 다음에 큐에 액세스할 때 유지되고 재배포됩니다.

예제: 임시 대기열 코드

...
// Create a temporary queue, one per client
Destination temporaryQueue = session.createTemporaryQueue();
MessageConsumer responseConsumer = session.createConsumer(temporaryQueue);

// This class handles messages to the temporary queue
responseConsumer.setMessageListener(this);

// Create the message to send
TextMessage textMessage = session.createTextMessage();
textMessage.setText("My new message!");

// Set the reply to field and correlation ID
textMessage.setJMSReplyTo(temporaryQueue);
textMessage.setJMSCorrelationID(myCorrelationID);

producer.send(textMessage);
...

유사한 방식으로 Session.createTemporaryTopic() 메서드를 사용하여 임시 항목을 생성합니다.