【问题标题】:QPID - Spring CachingConnectionFactory - ReconnectQPID - Spring CachingConnectionFactory - 重新连接
【发布时间】:2011-11-23 20:40:57
【问题描述】:

弹簧配置

 <bean id="jmsQueueConnectionFactory" class="org.apache.qpid.client.AMQConnectionFactory">
    <constructor-arg index="0"
        value="amqp://guest:guest@localhost/test?brokerlist='tcp://localhost:5672'" />
</bean>

<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="jmsQueueConnectionFactory" />
    <property name="sessionCacheSize" value="1" />
    <property name="reconnectOnException" value="true" />
</bean>

<bean id="myDestination" class="org.apache.qpid.client.AMQAnyDestination">
    <constructor-arg index="0" value="ADDR:myqueue; {create: always}" />
</bean>

<bean id="myServiceBean" class="com.test.MyService" />

<bean id="myContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="cachingConnectionFactory" />
    <property name="exceptionListener" ref="cachingConnectionFactory" /> 
    <property name="messageListener" ref="myServiceBean" />
    <property name="concurrentConsumers" value="1" />
    <property name="autoStartup" value="true" />
    <property name="destination" ref="myDestination" />
    <property name="recoveryInterval" value="10000" />      
</bean>

MyService.java

public class MyService implements MessageListener {
    public void onMessage(Message msg) {        
    log.info("----On Message called :"+msg+", :"+msg.getClass().getName());         
    }
}

当我重新启动 QPID 时

如果没有 reconnectOnException=true,我不断收到此异常,但没有重新连接

3203 [myContainer-1] 调试 org.springframework.jms.connection.CachingConnectionFactory - 为模式 1 创建缓存的 JMS 会话:org.apache.qpid.client.AMQSession_0_10@1d03a4e 3312 [myContainer-1] 调试 org.springframework.jms.connection.CachingConnectionFactory - 为目标 ['myqueue'/None; 创建缓存的 JMS MessageConsumer; { “创造”:“总是” }]: org.apache.qpid.client.BasicMessageConsumer_0_10@8a2023 99109 [myContainer-1] WARN org.springframework.jms.listener.DefaultMessageListenerContainer - 目标“myqueue”/None 的 JMS 消息侦听器调用程序设置失败; { “创造”:“总是” }' - 试图恢复。原因:等待会话打开超时(状态=已分离) org.apache.qpid.transport.SessionException:等待会话打开时超时(状态=已分离) 在 org.apache.qpid.transport.Session.invoke(Session.java:630) 在 org.apache.qpid.transport.Session.invoke(Session.java:559) 在 org.apache.qpid.transport.SessionInvoker.executionSync(SessionInvoker.java:84) 在 org.apache.qpid.transport.Session.sync(Session.java:782) 在 org.apache.qpid.transport.Session.sync(Session.java:770) 在 org.apache.qpid.client.BasicMessageConsumer_0_10.getMessageFromQueue(BasicMessageConsumer_0_10.java:423) 在 org.apache.qpid.client.BasicMessageConsumer.receive(BasicMessageConsumer.java:407) 在 org.springframework.jms.connection.CachedMessageConsumer.receive(CachedMessageConsumer.java:74) 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:429) 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:310) 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) 在 org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058) 在 org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050) 在 org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947) 在 java.lang.Thread.run(Thread.java:619) 99109 [myContainer-1] INFO org.springframework.jms.listener.DefaultMessageListenerContainer - 成功刷新 JMS 连接 .. 281125 [myContainer-3] INFO org.springframework.jms.listener.DefaultMessageListenerContainer - 成功刷新 JMS 连接

使用 reconnectOnException=true 时,它​​会连接和断开连接

13015 [IoReceiver - localhost/127.0.0.1:5672] WARN org.springframework.jms.connection.CachingConnectionFactory - 遇到 JMSException - 重置底层 JMS 连接 javax.jms.JMSException:连接中止 在 org.apache.qpid.client.AMQConnectionDelegate_0_10.closed(AMQConnectionDelegate_0_10.java:303) 在 org.apache.qpid.transport.Connection.closed(Connection.java:568) 在 org.apache.qpid.transport.network.Assembler.closed(Assembler.java:110) 在 org.apache.qpid.transport.network.InputHandler.closed(InputHandler.java:202) 在 org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:150) 在 java.lang.Thread.run(Thread.java:619) 引起:org.apache.qpid.transport.ConnectionException:连接中止 在 org.apache.qpid.transport.Connection.closed(Connection.java:541) ... 4 更多 13031 [IoReceiver - localhost/127.0.0.1:5672] 调试 org.springframework.jms.connection.CachingConnectionFactory - 关闭共享 JMS 连接:AMQConnection: 主机:本地主机 端口:5672 虚拟主机:测试 客户 ID:本地主机 活动会话数:1 73031 [IoReceiver - localhost/127.0.0.1:5672] 调试 org.springframework.jms.connection.CachingConnectionFactory - 无法关闭共享 JMS 连接 org.apache.qpid.client.JMSAMQException:等待会话打开时超时(状态=DETACHED) 在 org.apache.qpid.client.AMQConnection.stop(AMQConnection.java:824) 在 org.springframework.jms.connection.SingleConnectionFactory.closeConnection(SingleConnectionFactory.java:422) 在 org.springframework.jms.connection.SingleConnectionFactory.resetConnection(SingleConnectionFactory.java:321) 在 org.springframework.jms.connection.CachingConnectionFactory.resetConnection(CachingConnectionFactory.java:197) 在 org.springframework.jms.connection.SingleConnectionFactory.onException(SingleConnectionFactory.java:302) 在 org.springframework.jms.connection.ChainedExceptionListener.onException(ChainedExceptionListener.java:57) 在 org.apache.qpid.client.AMQConnectionDelegate_0_10.closed(AMQConnectionDelegate_0_10.java:306) ... 在 org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:150) 在 java.lang.Thread.run(Thread.java:619) 原因:org.apache.qpid.AMQException:超时等待会话打开(状态=DETACHED)[错误代码541:内部错误] 在 org.apache.qpid.client.AMQSession_0_10.setCurrentException(AMQSession_0_10.java:1050) 在 org.apache.qpid.client.AMQSession_0_10.sync(AMQSession_0_10.java:1030) 在 org.apache.qpid.client.AMQSession_0_10.sendSuspendChannel(AMQSession_0_10.java:857) 在 org.apache.qpid.client.AMQSession.suspendChannel(AMQSession.java:3006) 在 org.apache.qpid.client.AMQSession.stop(AMQSession.java:2341) 在 org.apache.qpid.client.AMQConnection.stop(AMQConnection.java:820) ... 11 更多 104875 [myContainer-1] INFO org.springframework.jms.connection.CachingConnectionFactory - 已建立共享 JMS 连接:AMQConnection: 主机:本地主机 端口:5672 虚拟主机:测试 客户 ID:本地主机 活动会话数:0 104875 [myContainer-1] INFO org.springframework.jms.listener.DefaultMessageListenerContainer - 成功刷新 JMS 连接 104875 [myContainer-2] 调试 org.springframework.jms.connection.CachingConnectionFactory - 为模式 1 创建缓存的 JMS 会话:org.apache.qpid.client.AMQSession_0_10@191e4c 104937 [IoReceiver - localhost/127.0.0.1:5672] 警告 org.springframework.jms.connection.CachingConnectionFactory - 遇到 JMSException - 重置底层 JMS 连接 javax.jms.JMSException:404 在 org.apache.qpid.client.AMQConnection.exceptionReceived(AMQConnection.java:1230) 在 java.lang.Thread.run(Thread.java:619) 引起:org.apache.qpid.AMQException: ch=0 id=0 ExecutionException(errorCode=NOT_FOUND, commandId=0, description=Queue: myqueue not found) [error code 404: not found] 在 org.apache.qpid.client.AMQSession_0_10.setCurrentException(AMQSession_0_10.java:1050) ... 29 更多 104937 [IoReceiver - localhost/127.0.0.1:5672] 调试 org.springframework.jms.connection.CachingConnectionFactory - 关闭共享 JMS 连接:AMQConnection: 主机:本地主机 端口:5672

【问题讨论】:

    标签: java spring qpid


    【解决方案1】:

    您是否尝试过忽略 DMLC 上的 exceptionListener 设置?我不记得曾经需要指定这一点,而且在启动连接恢复后,您的连接似乎正在失效。

    另外,假设您没有使用 JBoss 4,您可以尝试使用 DMLC 的内置缓存机制(通过 cacheLevel 设置),而不是为您的消费者使用缓存连接工厂;您甚至可以获得更好的性能,因为 DMLC 可以缓存会话和消费者以及连接。

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2019-05-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2021-03-03
      • 2015-08-26
      • 2013-03-18
      相关资源
      最近更新 更多