2016-07-19 2 views
0

서버 간 통신을 위해 ActiveMQ를 사용하고 있습니다.ActiveMQ : queue VS temporaryQueue

모든 서버는 메시지를 보내려면 하나의 대기열을 보유하고 메시지를 수신하려면 각 스레드 당 temporaryQueue를 보유합니다.

내가 잠시 후

Cannot publish to a deleted Destination: temp-queue: xxx 

를 수신하고 ~> 32 개 스레드에 대한 사용하고 있습니다.

내가 temporaryQueue에서 "regular"대기열로 변경하면 모든 것이 완벽하게 작동합니다.

(session.createQueue(...) instead of session.createTemporaryQueue()) 

왜이 오류가 발생합니까?

"정기"대기열을 사용할 때 비용이 더 많이 듭니까?

+0

우선 임시 대기열을 사용해야하는 이유가 확실하지 않습니다. –

+0

http://activemq.apache.org/how-should-i-implement-request-response-with-jms.html –

답변

0

비 임시 대기열을 사용하여 요청 응답을 구현하려면 응답을 요청과 상관시키는 방법이 필요합니다. correlation-id 헤더를 사용할 수 있습니다. 이후 요청 고유의 일반 대기열을 만들지 않아도되지만 고정 된 대기열 집합을 생성해야하기 때문입니다. ORDER.CONFIRMATION.RESPONSE 또는 이와 유사합니다. 따라서 재사용하는 경우 일반 큐를 사용하는 것이 비용이 적게 듭니다.

공통 응답 큐에서 여러 스레드를 사용하여 메시지를 읽으려면 메시지 선택기를 사용하여 특정 응답에 대한 JMSCorrelationID 헤더를 선택하십시오.

그러나 임시 대기열을 사용할 수도 있습니다. 문제는 일종의 사용 문제 일 가능성이 높습니다. 그러나 제공되는 정보는 구현이나 분석이 없으므로 실마리를 제공하지 않습니다.

+0

ActiveMQ 사양에서 : JMS를 통해 요청 - 응답을 구현하는 가장 좋은 방법은 임시 대기열을 만드는 것입니다 및 시작시 클라이언트 당 사용자가 각 메시지의 JMSReplyTo 등록 정보를 임시 대기열로 설정 한 다음 각 메시지에서 상관 ID를 사용하여 요청 메시지를 응답 메시지와 상관시킵니다. 이렇게하면 각 요청에 대해 소비자를 생성하고 닫는 데 드는 오버 헤드 (비싸다)를 피할 수 있습니다. 또한 원하는 경우 여러 스레드에서 동일한 제작자 및 사용자를 공유 할 수도 있습니다 (또는 풀링 할 수도 있음). –

+0

많은 스레드를 피하려면이 작업을 수행하십시오. 그러나 어떤 이유로 메시징 실패가 발생합니다. –