Java 在RabbitMq重新启动时,使用者不使用

Java 在RabbitMq重新启动时,使用者不使用,java,spring,tomcat,spring-rabbit,Java,Spring,Tomcat,Spring Rabbit,我们使用SpringRabbit从同一个应用程序生成和使用消息,但是,我们注意到,当RabbitMq重新启动时,队列将继续增长,直到我们重新启动Tomcat。起初,我们认为拥有一个高可用性队列可以解决这个问题,但事实并非如此。以下是Spring Rabbit配置的messaging.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/bea

我们使用SpringRabbit从同一个应用程序生成和使用消息,但是,我们注意到,当RabbitMq重新启动时,队列将继续增长,直到我们重新启动Tomcat。起初,我们认为拥有一个高可用性队列可以解决这个问题,但事实并非如此。以下是Spring Rabbit配置的messaging.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:rabbit="http://www.springframework.org/schema/rabbit"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/rabbit
            http://www.springframework.org/schema/rabbit/spring-rabbit-1.3.xsd">

    <!--  RabbitMQ -->
    <rabbit:connection-factory id="rabbitConnectionFactory" addresses="${rabbitMq.hostName}" username="${rabbitMq.userName}" password="${rabbitMq.password}" virtual-host="${rabbitMq.vHost}" />
    <rabbit:admin connection-factory="rabbitConnectionFactory"/>

    <!-- RabbitMQ Template -->
    <rabbit:template id="rabbitTemplate" connection-factory="rabbitConnectionFactory" message-converter="messageConverter" exchange="${rabbitMq.myExchange}" />

    <!-- RabbitMQ Exchange and Binding Definition -->
    <rabbit:direct-exchange name="${rabbitMq.yEmxchange}">
        <rabbit:bindings>
            <rabbit:binding key="${rabbitMq.routing.key.events}" queue="${rabbitMq.queue.events.name}"/>
        </rabbit:bindings>
    </rabbit:direct-exchange>

    <!-- RabbitMQ Queue Definitions -->
    <rabbit:queue name="${rabbitMq.queue.events.name}" >
        <rabbit:queue-arguments>
            <entry key="x-ha-policy" value="all"/>
        </rabbit:queue-arguments>
    </rabbit:queue>

    <!-- Listeners -->
    <rabbit:listener-container id="listener" connection-factory="rabbitConnectionFactory" concurrency="3" max-concurrency="5" requeue-rejected="false">
        <rabbit:listener ref="eventNotificationAdapter" queues="${rabbitMq.queue.events.name}" priority="${rabbitMq.queue.events.priority}" />
    </rabbit:listener-container>

    <!-- Message Listener Adapters -->
    <bean id="eventNotificationAdapter" class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">
        <constructor-arg name="delegate" ref="eventConsumer"/>
        <constructor-arg name="messageConverter" ref="messageConverter"/>
        <property name="defaultListenerMethod" value="process"/>
    </bean>

    <bean id="messageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"/>

</beans>

基于此配置,是否有人知道为什么重新启动RabbitMq服务器后队列会继续增长而不会被消耗?我们始终必须重新启动应用程序运行的Web服务器(Tomcat),使其重新开始使用。

您使用的是哪一版本的Spring AMQP?容器应每5秒尝试重新连接一次(默认情况下,可通过容器上的
recoveryInterval
进行更改)<代码>11:57:52.131警告[SimpleAsynctaskeExecutor-13][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer]使用者引发的异常,如果连接工厂支持,可以重新启动处理。异常摘要:org.springframework.amqp.AmqpConnectException:java.net.ConnectException:connectionseeded-在代理返回之前,您应该每5秒看到一个异常。嗨,Gary,我正在使用org.springframework.amqp:springrabbit:1.3.3.release您在日志中看到类似的内容吗?如果没有,那么我怀疑线程挂在代码中的某个地方。您可以使用jstack进行线程转储,以查看
SimpleAsyncTaskExecutor nn
线程正在做什么。@GaryRussell我在日志中没有看到类似的内容。因此
jstack
是您下次看到挂起时的朋友。
@Component("eventConsumer")
public class EventQueueConsumer {

    @Autowired
    EventsClient eventsClient;

    private static Logger logger = LoggerFactory.getLogger(EventQueueConsumer.class);

    public void process(MyEvent myEvent) {
        logger.info("processing myEvent: {}", myEvent);
        try{
            eventsClient.sendEvent(myEvent);
        } catch(Exception e) {
            logger.error("Exception occurred trying to send event.", e);
        }
    }
}