2014-06-16 6 views
1

현재 rabbit-amqp 구현 프로젝트에서 작업 중이며 spring-rabbit을 사용하여 프로그래밍 방식으로 모든 대기열, 바인딩 및 교환을 설정합니다.큐를 복구 한 후 바인딩 재 선언

나는 그것을 삭제 된 경우 큐를 다시 시도하고 참조 문서에 다음을 발견 해요 : 처리를위한 개선의 숫자를 도입

3.14 리스너 컨테이너 대기열

버전 1.3 리스너 컨테이너의 여러 대기열

컨테이너는 하나 이상의 대기열에서 수신 대기하도록 구성되어야합니다. 이것은 이전에도 마찬가지 였지만 이제는 런타임에 큐를 추가하고 제거 할 수 있습니다. 컨테이너는 미리 가져온 메시지가 처리 될 때 소비자에게을 재활용 (취소 및 다시 생성)합니다. addQueues, addQueueNames, removeQueues 및 removeQueueNames 메서드를 참조하십시오. 대기열을 제거 할 때 하나 이상의 대기열이 남아 있어야합니다.

대기열 중 하나가 사용 가능하면 소비자가 시작됩니다. 이전에는 대기열을 사용할 수 없으면 컨테이너가 중지됩니다. 이제 대기열이없는 경우에만 해당됩니다. 모든 대기열을 사용할 수없는 경우 컨테이너는 누락 된 대기열을 60 초마다 수동으로 선언하고 소비합니다. ... :

내가이 시나리오를 시도하고 실제로 내 대기 행렬이 재현 (소스 http://docs.spring.io/spring-amqp/docs/1.3.4.RELEASE/reference/html이 글을 쓰는 시간 동안 다운 된)하지만, 큐와 교류 사이의 바인딩이 손실됩니다. 큐를 삭제 한 후 바인딩을 사용하여 대기열을 다시 만들려면 어떻게합니까?

답변

0

모든 선언 (Queue, Exchange, Binding)이 콩으로 등록되어 있으면 실제로 작동해야합니다.

queuesChanged()SimpleMessageListenerContainerrabbitAdmin.initialize()을 호출하며, 누가 차례로 언급 된 RabbitMQ 환경을 처리합니다.

그것은 단지이 경우에 발생합니다 응용 프로그램 컨텍스트에서 Queue 현재 queueNames에 포함되어있는 경우

if (queueNames.contains(queue.getName()) && queue.isAutoDelete() 
         && this.rabbitAdmin.getQueueProperties(queue.getName()) == null) { 

, 그것은 auto-delete이며 브로커에 (rabbitAdmin.getQueueProperties)에 존재하지 않는이 브로커에 연결을 시도합니다 Queue에 대한 정보를 얻으십시오. 어떤 소비자가없는 경우

UPDATE는

권리는 물론, queue은 삭제됩니다.

https://jira.spring.io/browse/AMQP이 그것을 지적 해 주셔서 감사합니다 :

if (queueNames.contains(queue.getName()) 
      && (queue.isAutoDelete() || queue.getArguments().containsKey("x-expires"))) 
     && this.rabbitAdmin.getQueueProperties(queue.getName()) == null) { 

것은 JIRA의 문제를 제기 주시기 바랍니다 : 당신이 바로 x-expires (Queue TTL)에 관한하고 우리가 그와 거래를 얻어야한다, 너무 좋아

이 보이는 - +1

+0

하지만 대기열에 autoDelete가 있어야합니다. 내가 알기로는 이것은 소비자가 대기열에 연결되어 있지 않으면 자동으로 삭제되고 대기열에있는 모든 메시지가 삭제된다는 것을 의미합니다. 큐의 x-expires 인수를 사용하여이 작업을 수행 할 수도 있습니까? – JustinV

+0

Answer –

+0

'x-expires' 인자를 검사하는 것만으로는 충분하지 않다는 것을 명심하십시오; 큐는 [서버 측 정책] (http://www.rabbitmq.com/ttl.html)을 사용할 때 만료 될 수 있습니다. 어쩌면 각 소비자가 시작될 때 항상 재 선언해야합니다. 즉, 이는 컨테이너가 적어도 만료 시간 동안 중지 된 상태로 응용 프로그램 컨텍스트가 실행되는 드문 경우입니다. 컨텍스트가 초기화 될 때 관리자가 대기열을 선언합니다. 유스 케이스를 설명 할 수 있습니까? –