2015-04-21 12 views
5

मैं खरगोश एमक 3.4.1 जावा क्लाइंट लाइब्रेरी का उपयोग कर रहा हूं और ऑटो रिकवरी तंत्र का काम नहीं कर पा रहा हूं।खरगोश एमक्यू: कनेक्शन रिकवरी तंत्र

यह कैसे मैं खरगोश MQ कनेक्शन कारखाना बनाने रहा है:

factory = new ConnectionFactory(); 
factory.setUsername(userName); 
factory.setPassword(password); 
factory.setVirtualHost(virtualHost); 
factory.setAutomaticRecoveryEnabled(true); 
factory.setNetworkRecoveryInterval(5); 
factory.setRequestedHeartbeat(3); 

संदेश के प्रकाशन के बाद, यदि मैं बंद खरगोश MQ दलाल और इसे फिर से लाने के लिए, मैं वसूली तंत्र में किक करने की उम्मीद और कनेक्शन 'sane' स्थिति में बहाल किया गया है। लेकिन मुझे नीचे त्रुटि मिलती है:

com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; protocol method: #method<connection.close>(reply-code=320, reply-text=CONNECTION_FORCED - broker forced connection closure with reason 'shutdown', class-id=0, method-id=0) 
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190) ~[amqp-client-3.4.1.jar:na] 
    at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:291) ~[amqp-client-3.4.1.jar:na] 
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:654) ~[amqp-client-3.4.1.jar:na] 
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:631) ~[amqp-client-3.4.1.jar:na] 
    at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:622) ~[amqp-client-3.4.1.jar:na] 

क्या मुझे यहां कुछ याद आ रही है? इस समस्या के आसपास काम करने का एकमात्र तरीका शटडाउन लिस्टर को पंजीकृत करना और खरगोश एमक कनेक्शन फैक्ट्री, कनेक्शन और चैनलों को फिर से शुरू करना है।

इसके अलावा

"chrislott"

टिप्पणी जवाब देने के लिए, मैं ऑटो वसूली ठीक करने के लिए में लात देखते हैं। मैं एक अस्थायी चैनल का उपयोग करके एक विनिमय बनाएँ:

Channel channel = connection.createChannel(); 
channel.exchangeDeclare(exchangeName, exchangeType, durable); 
channel.close(); 

और मैं नीचे अपवाद जब इसकी टोपोलॉजी को ठीक करने की कोशिश कर देखें:

Caught an exception when recovering topology Caught an exception while recovering exchange testSuccessfulInitVirtualHost_Exchange: channel is already closed due to clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0) 
com.rabbitmq.client.TopologyRecoveryException: Caught an exception while recovering exchange testSuccessfulInitVirtualHost_Exchange: channel is already closed due to clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0) 
    at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverExchanges(AutorecoveringConnection.java:482) 
    at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverEntities(AutorecoveringConnection.java:467) 
    at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:411) 
    at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access$000(AutorecoveringConnection.java:52) 
    at com.rabbitmq.client.impl.recovery.AutorecoveringConnection$1.shutdownCompleted(AutorecoveringConnection.java:351) 
    at com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75) 
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:574) 

ऊपर अपवाद नहीं देखा जाता है कि अगर मैं बंद नहीं करते चैनल जिसका उपयोग एक्सचेंज बनाने के लिए किया जाता है।

उत्तर

2

खरगोश एमक्यू कनेक्शन की मेरी पढ़ाई फैक्टरी # setAutomaticRecoveryEnabled (बूलियन) विधि यह है कि यह मुख्य रूप से नेटवर्क विफलता से वसूली को सक्षम बनाता है। https://www.rabbitmq.com/api-guide.html

उदाहरण के लिए, अपने मशीन शायद एक स्विच या अन्य विफलता की वजह से समय की अवधि के लिए दलाल के लिए एक मार्ग खो देता है,, तो स्वचालित वसूली कर सकते हैं एक को फिर से स्थापित:

यहाँ एक अच्छा चर्चा है कनेक्शन इत्यादि। डॉक्टर ब्रोकर शटडाउन/पुनरारंभ करने के बारे में कुछ भी नहीं कहता है, मुझे नहीं लगता कि आपकी अपेक्षा उचित है।

ब्रोकर पुनरारंभ से पुनर्प्राप्त करने के लिए आईएमएचओ, शटडाउन-श्रोता दृष्टिकोण एक ठोस दृष्टिकोण प्रतीत होता है।

+0

लेकिन मुझे पुनर्प्राप्ति के लिए ऑटो रिकवरी लात मार रही है। मैं एक अस्थायी चैनल का उपयोग करके एक एक्सचेंज बना देता हूं: चैनल चैनल = connection.createChannel(); channel.exchangeDeclare (एक्सचेंजनाम, एक्सचेंज टाइप, टिकाऊ); channel.close(); – user170008

1

आम तौर पर खरगोश के ग्राहक को वसूली को संभालना चाहिए - आपको इसे मैन्युअल रूप से पुन: कार्यान्वित नहीं करना चाहिए। कम से कम lyra का उपयोग करने का प्रयास करें।

मुझे विफलता परीक्षण के दौरान कुछ समस्याएं थीं। ब्रोकर पुनरारंभ पर कनेक्शन हमेशा के लिए लटकना शुरू कर देते हैं, इसलिए लॉग में आखिरी चीज शटडाउन सिग्नल अपवाद था। मैंने इसे सेट करके तय किया:

factory.setConnectionTimeout(20_000); 

भी पुनर्प्राप्ति अस्थायी कतारों के साथ अच्छी तरह से नहीं चलती थी। यदि आपके पास हैं तो आपको शायद कुछ अतिरिक्त हैंडलिंग करना होगा (फिर, पहले लीरा आज़माएं)।

संबंधित मुद्दे