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()
메서드를 사용하여 임시 항목을 생성합니다.