2014-04-24 3 views
5

हमारे पास क्लोजर कोड है जो एक खरगोश कतार से पढ़ता है। हम उस मामले को बर्दाश्त करना चाहते हैं जहां RabbitMQ सर्वर संक्षिप्त रूप से नीचे है, उदा। पुनरारंभ करने के मामले में (sudo service rabbitmq-server restart)।Langohr में RabbitMQ पुनरारंभ कैसे सहन करें?

लैंगोहर में some provision for reconnecting प्रतीत होता है। हमने उदाहरण clojurewerkz.langohr.examples.recovery.example1 (Gist here) को अनुकूलित किया। प्रकाशित उदाहरण बनाम थोड़ा अंतर बनाम कनेक्शन पैरामीटर, और lb/publish कॉल को हटाने (क्योंकि हम बाहरी स्रोत के साथ डेटा भर रहे हैं) शामिल हैं।

हम सफलतापूर्वक कतार से डेटा का उपभोग कर सकते हैं और अधिक संदेशों की प्रतीक्षा कर सकते हैं। हालांकि, जब हम RMQ (वीएम होस्टिंग RabbitMQ पर ऊपर 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 द्वारा प्रदान की टूट रहा है जब यह में लात मारता है लगता है। क्या कोई वैकल्पिक पैटर्न है जिसे इन "हार्ड" पुनरारंभ के मामले में प्राथमिकता दी जाती है? वैकल्पिक रूप से, मुझे लगता है कि हमें कनेक्शन निगरानी लागू करना है और खुद को पुनः प्रयास करना है। किसी भी सुझाव का स्वागत किया जाएगा।

उत्तर

2

हम ऐसे स्टैक निशान देखना चाहते थे, लेकिन अब हम उन्हें Langohr 2.9.0 के साथ नहीं देखते थे। पुनरारंभ करने के बाद, हमारे क्लोजर क्लाइंट फिर से कनेक्ट होते हैं और संदेश फिर से बहने लगते हैं।

हम चूक है, जो कनेक्शन और टोपोलॉजी कवरेज का उपयोग कर रहे हैं, पर दिया के रूप में इस के द्वारा दिखाया:

(infof "Automatic recovery enabled? %s" (rmq/automatic-recovery-enabled? connection)) 
(infof "Topology recovery enabled? %s" (rmq/automatic-topology-recovery-enabled? connection)) 
संबंधित मुद्दे