8

春の構成

 <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] DEBUG org.springframework.jms.connection.CachingConnectionFactory - モード 1 のキャッシュされた JMS セッションの作成: org.apache.qpid.client.AMQSession_0_10@1d03a4e
3312 [myContainer-1] DEBUG org.springframework.jms.connection.CachingConnectionFactory - 宛先のキャッシュされた JMS MessageConsumer の作成 ['myqueue'/None; {
  '作成': '常に'
}]: org.apache.qpid.client.BasicMessageConsumer_0_10@8a2023
99109 [myContainer-1] WARN org.springframework.jms.listener.DefaultMessageListenerContainer - 宛先 ''myqueue'/None の JMS メッセージ リスナー インボーカーのセットアップに失敗しました。{
  '作成': '常に'
}' - 回復しようとしています。原因: セッションがオープンになるのを待機中にタイムアウトになりました(状態=DETACHED)。
org.apache.qpid.transport.SessionException: セッションが開くのを待ってタイムアウトしました (state=DETACHED)
    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] 警告 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] DEBUG org.springframework.jms.connection.CachingConnectionFactory - 共有 JMS 接続を閉じています: AMQConnection:
ホスト: ローカルホスト
ポート: 5672
仮想ホスト: テスト
クライアント ID: ローカルホスト
アクティブなセッション数: 1
73031 [IoReceiver - localhost/127.0.0.1:5672] DEBUG 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] DEBUG 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) [エラーコード 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] DEBUG org.springframework.jms.connection.CachingConnectionFactory - 共有 JMS 接続を閉じています: AMQConnection:
ホスト: ローカルホスト
ポート: 5672


4

1 に答える 1

1

DMLC で exceptionListener 設定を省略しようとしましたか? それを指定する必要があったことを思い出したことはありません.接続の回復が開始された後、接続が無効になっているようです.

また、JBoss 4 を使用していないと仮定すると、コンシューマ用のキャッシング接続ファクトリを使用する代わりに、(cacheLevel 設定を介して) DMLC の組み込みキャッシング メカニズムを使用してみてください。DMLC は接続だけでなく、セッションとコンシューマーもキャッシュできるため、パフォーマンスが向上する可能性もあります。

于 2014-03-05T21:32:54.173 に答える