2014-04-24 17 views
5

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.

cevap

2

Böylesine yığın izlerini görüyorduk, ancak biz onları Langohr 2.9.0 ile görmeyiz. Yeniden başlatmanın ardından, clojure istemcilerimiz yeniden bağlanır ve iletiler yeniden akmaya başlar. Bu gösterildiği gibi bağlantı ve topoloji kapsama sahip varsayılan, kullandığınız

, açık:

(infof "Automatic recovery enabled? %s" (rmq/automatic-recovery-enabled? connection)) 
(infof "Topology recovery enabled? %s" (rmq/automatic-topology-recovery-enabled? connection))