bugfix> spring > 投稿

spring-amqpライブラリを使用してRabbitMQからのメッセージを消費し、場合によってはメッセージを確認しているときに次の例外が発生します。

org.springframework.amqp.AmqpException: PublisherCallbackChannel is closed
  at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:908)
  at com.sun.proxy.$Proxy265.basicAck(Unknown Source)
  at com.zeus.server.queue.AbstractBatchingQueueMessageListener.ackBatch(AbstractBatchingQueueMessageListener.java:105)
  at com.zeus.server.queue.AbstractBatchingQueueMessageListener.executeBatch(AbstractBatchingQueueMessageListener.java:88)
  at com.zeus.server.queue.AbstractBatchingQueueMessageListener.access$300(AbstractBatchingQueueMessageListener.java:27)
  at com.zeus.server.queue.AbstractBatchingQueueMessageListener$BatchExecutor.run(AbstractBatchingQueueMessageListener.java:161)
  at java.util.TimerThread.mainLoop(Timer.java:555)
  at java.util.TimerThread.run(Timer.java:505)

何か案は?

参考:RabbitMQ 3.5.6およびspring-amqp:1.6.1.RELEASEを使用しています

回答 1 件
  • @ArtemBilanが述べた5秒の遅延は、受信者が保留中のパブリッシャーの確認がある場合に、物理的に閉じた後にチャネルを開いたままにするクッションです。そのためには5秒で十分です。

    ここではまったく関係ありません。リスナーコンテナは、シャットダウンされるまでチャネルを決して閉じません。その場合でも、メソッドを終了した後、リスナースレッドによって閉じられます。

    確認中にチャンネルクローズエラーが発生した場合、それは別の何かがチャンネルを閉じたことを意味します。おそらく接続の切断。

    ログやウサギサーバーログを先に見て、手がかりがあるかどうかを確認することをお勧めします。

    1.6.1はほぼ2歳です。

    これがまだ始まったばかりの場合は、アプリ/環境の他の何かが変更されたと思われます。

    私はあなたの並行性が1だと思います-さもなければ、各スレッドが独自のチャネルを持っているのであなたがしていることは悪いです。

    編集

    executorを使用していることに気付きました-それはできません。チャネルはスレッドセーフではありません。リスナースレッドでバッチを実行する必要があります。

     at com.zeus.server.queue.AbstractBatchingQueueMessageListener.ackBatch(AbstractBatchingQueueMessageListener.java:105)
      at com.zeus.server.queue.AbstractBatchingQueueMessageListener.executeBatch(AbstractBatchingQueueMessageListener.java:88)
      at com.zeus.server.queue.AbstractBatchingQueueMessageListener.access$300(AbstractBatchingQueueMessageListener.java:27)
      at com.zeus.server.queue.AbstractBatchingQueueMessageListener$BatchExecutor.run(AbstractBatchingQueueMessageListener.java:161)
    
    

    https://www.rabbitmq.com/api-guide.html#channel-threads

あなたの答え