2017-12-12 18 views
0

사용할 수 RabbitMq 서버는 Rabbitmq Exchange를 일부 메시지를 생산 및 토끼와 QUEUENAME에 메시지 기지 Listener.but 큐 스피에는 메시지토끼 리스너 Rabbitmq 노드가 다운되면 항상 소비자를 실행하거나 중지

항상 점점없는 경우 있음을 소모하고 때

<bean id="rabbitListenerContainerFactory" class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <property name="concurrentConsumers" value="5"/> 
     <property name="maxConcurrentConsumers" value="10"/> 
     <property name="prefetchCount" value="10"/> 
     <property name="defaultRequeueRejected" value="false"/> 
</bean> 
<rabbit:listener-container connection-factory="connectionFactory" concurrency="5" prefetch="10" acknowledge="auto" idle-event-interval="500000000000000"> 
    <rabbit:listener ref="rabbitListenerContainerFactory" queue-names="queue.email" /> 
    <rabbit:listener ref="rabbitListenerContainerFactory" queue-names="queue.sms" /> 
    </rabbit:listener-container> 

아래 내가 RabbitMq 노드가 정지되어있는 동안 예외를 받고 없습니다 기대하고 같은 내 코드는

org.springframework.amqp.rabbit.connection.AutoRecoverConnectionNotCurrentlyOpenException: Auto recovery connection is not currently open 
    at org.springframework.amqp.rabbit.connection.SimpleConnection.isOpen(SimpleConnection.java:95) 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.isOpen(CachingConnectionFactory.java:1151) 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getChannel(CachingConnectionFactory.java:420) 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.access$1500(CachingConnectionFactory.java:97) 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createChannel(CachingConnectionFactory.java:1084) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1435) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1411) 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1387) 
    at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:336) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.redeclareElementsIfNecessary(SimpleMessageListenerContainer.java:1114) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1100(SimpleMessageListenerContainer.java:95) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1333) 
    at java.lang.Thread.run(Thread.java:745) 

C 아무도 우리가이 문제를 피하도록 도울 수 있습니까?

답변

0

어떤 버전을 사용하고 있습니까?

기본 연결 팩토리를 직접 구성하는 경우 autoRecoveryEnabled에서 false으로 설정하십시오.

Configuring the Underlying Client Connection Factory을 참조하십시오.

참고 4.0.x 클라이언트는 기본적으로 자동 복구를 사용합니다. 이 기능과 호환되는 반면, Spring AMQP는 자체 복구 메커니즘을 가지고 있으며 클라이언트 복구 기능은 일반적으로 필요하지 않습니다. 브로커가 사용 가능하지만 아직 연결이 복구되지 않았을 때 AutoRecoverConnectionNotCurrentlyOpenException을 얻지 않으려면 amqp-client 자동 복구를 비활성화하는 것이 좋습니다. 예를 들어 RetryTemplate이 RabbitTemplate에 구성되어있는 경우 클러스터의 다른 브로커로 장애 조치가 수행되는 경우에도이 예외가 발생할 수 있습니다. 자동 복구 연결이 타이머에서 복구되기 때문에 Spring AMQP의 복구 메커니즘을 사용하여 연결을 더 빠르게 복구 할 수 있습니다. 버전 1.7.1부터는 사용자 자신의 RabbitMQ 연결 팩토리를 명시 적으로 생성하고 CachingConnectionFactory에 제공하지 않는 한 Spring AMQP가이를 비활성화합니다. RabbitConnectionFactoryBean에 의해 생성 된 RabbitMQ ConnectionFactory 인스턴스는 기본적으로 비활성화 된 옵션을 갖습니다.

+0

속성 autoRecoveryEnabled는 SimpleListenerContainer factory.i에서 사용할 수 없습니다. CachingConnectionFactory로 확인했습니다. 또한 autoStartup도 사용할 수 있습니다. 해당 구성을 추가하면 도움이됩니다. – Balaji

+0

우리는 그 재산을 장려하고 싶지 않습니다. 1.7.0을 사용하지 않는 한 com.rabbitmq 연결 팩토리를 삽입하지 않으면 기본적으로이 속성이 false입니다 (1.7.0을 사용하는 경우 1.7.5로 업그레이드해야 함) com.rabbitmq 연결 팩토리의 경우 해당 속성을 false로 설정해야합니다. –