5

Rabbit キューから読み取る Clojure コードがあります。再起動の場合など、RabbitMQ サーバーが一時的にダウンする場合を許容したいと考えています ( sudo service rabbitmq-server restart)。

ランゴールで再接続するための規定があるようです。例を適応させましたclojurewerkz.langohr.examples.recovery.example1( Gist here )。公開された例とのわずかな違いには、接続パラメーターとlb/publish呼び出しの削除が含まれます (外部ソースでデータを入力しているため)。

キューからデータを正常に消費し、さらにメッセージを待つことができます。ただし、(RabbitMQ をホストしている VM で上記のコマンドを使用して) RMQ を再起動するsudoと、次の例外がスローされます。

Caught an exception during connection recovery!
java.io.IOException
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106)
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102)
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:378)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:516)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
    at com.novemberain.langohr.Connection.recoverConnection(Connection.java:166)
    at com.novemberain.langohr.Connection.beginAutomaticRecovery(Connection.java:115)
    at com.novemberain.langohr.Connection.access$000(Connection.java:18)
    at com.novemberain.langohr.Connection$1.shutdownCompleted(Connection.java:93)
    at com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:573)
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; reason: java.io.EOFException
    at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67)
    at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33)
    at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:343)
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:321)
    ... 8 more
Caused by: java.io.EOFException
    at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:273)
    at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)
    at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:131)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:533)

Langohr が提供する意図された再起動メカニズムは、起動時に壊れている可能性があります。これらの「ハード」再起動の場合に優先される代替パターンはありますか? または、接続監視を実装して自分で再試行する必要があると思います。どんな提案でも大歓迎です。

4

1 に答える 1

2

以前はこのようなスタック トレースが見られましたが、Langohr 2.9.0 では見られなくなりました。再起動後、clojure クライアントが再接続し、メッセージが再び流れ始めます。

以下に示すように、接続とトポロジのカバレッジがオンになっているデフォルトを使用しています。

(infof "Automatic recovery enabled? %s" (rmq/automatic-recovery-enabled? connection))
(infof "Topology recovery enabled? %s" (rmq/automatic-topology-recovery-enabled? connection))
于 2014-09-30T16:44:01.333 に答える