Tavşan kuyruğundan okuyan Clojure kodumuz var. RabbitMQ sunucusunun kısa süreliğine olduğu durumu tolere etmek isteriz, örn. Yeniden başlatma durumunda (sudo service rabbitmq-server restart
). Langohr'da some provision for reconnecting var gibi görünüyor. clojurewerkz.langohr.examples.recovery.example1
(Gist here) örneğini uyarladık. Yayınlanan örnekle karşılaştırıldığında hafif farklılıklar bağlantı parametrelerini ve lb/publish
çağrısının kaldırılmasını içerir (verileri harici bir kaynakla doldurduğumuzdan).Langohr'da RabbitMQ yeniden başlatmaları nasıl tolere edilir?
Kuyruktaki verileri başarılı bir şekilde tüketebilir ve daha fazla ileti bekleyebiliriz. Biz (RabbitMQ barındırma VY'de yukarıdaki sudo
komutu ile) RMQ yeniden Ancak, aşağıdaki istisnası atılır:
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)
O içinde tekmelediğinde Langohr tarafından sağlanan amaçlanan yeniden başlatma mekanizması kırılıyor gibi görünmektedir. Bu "zor" yeniden başlatmalarda tercih edilen alternatif bir model var mı? Alternatif olarak, bağlantı izlemeyi uygulamak zorunda olduğumuzu ve kendimizi yeniden denediğimizi varsayalım. Herhangi bir öneri en hoş gelecektir.