2012-01-12 17 views
22

मैं कुछ जावा कोड डिबग कर रहा हूं जो माइक्रोसॉफ्ट ऑफिस दस्तावेज़ों से डेटा खींचने के लिए अपाचे पीओआई का उपयोग करता है। कभी-कभी, यह स्मृति से बाहर होने पर एक बड़ा दस्तावेज़ और पीओआई दुर्घटनाओं का सामना करता है। उस बिंदु पर, यह त्रुटि को RabbitMQ में प्रकाशित करने का प्रयास करता है, ताकि अन्य घटक जान सकें कि यह चरण विफल रहा है और उचित कार्यवाही करें। हालांकि, जब यह कतार में प्रकाशित करने का प्रयास करता है, तो यह com.rabbitmq.client.AlreadyClosedException (clean connection shutdown; reason: Attempt to use closed channel) मिलता है।मेरे खरगोश एमक्यू चैनल बंद क्यों रहते हैं?

private void publish(String exch, String route, 
    AMQP.BasicProperties props, Map<String, Object> message) throws Exception{ 
    chan.basicPublish(exch, route, props, 
     JSONValue.toJSONString(message).getBytes()); 
} 

मैं कोशिश ब्लॉक RabbitMQ चैनल को बंद करने के लिए प्रकट होता है कि भीतर किसी भी कोड नहीं मिल सकता है:

try { 
    //Extraction and indexing code 
} 
catch(Throwable t) { 
    // Something went wrong! We'll publish the error and then move on with 
    // our lives 
    System.out.println("Error received when indexing message: "); 
    t.printStackTrace(); 
    System.out.println(); 
    String error = PrintExc.format(t); 
    message.put("error", error); 

    if(mime == null) { 
     mime = "application/vnd.unknown"; 
    } 

    message.put("mime", mime); 
    publish("IndexFailure", "", MessageProperties.PERSISTENT_BASIC, message); 
} 

पूर्णता के लिए, यहाँ प्रकाशित विधि है:

यहाँ त्रुटि हैंडलर कोड है । क्या ऐसी कोई परिस्थिति है जिसमें चैनल को बंद कर दिया जा सकता है?

EDIT: मुझे ध्यान रखना चाहिए कि पहले से ही क्लोज़ एक्सेप्शन basicPublish प्रकाशित के अंदर कॉल द्वारा फेंक दिया गया है।

+0

कैसे आप इस समस्या का समाधान: 1. कतार जो एक अच्छा समाधान 2. रीसेट RabbitMQ से नहीं है के नाम का नाम बदलने? –

उत्तर

30

एक चैनल त्रुटि पर एक एएमक्यूपी चैनल बंद है। दो आम चीजें हैं जो एक चैनल त्रुटि पैदा कर सकता है:

  • एक मुद्रा के लिए एक संदेश है कि अस्तित्व में नहीं है
  • उस के साथ एक कतार नहीं है तत्काल ध्वज सेट के साथ एक संदेश प्रकाशित करने के लिए कोशिश कर रहा है प्रकाशित करने के लिए कोशिश कर रहा है एक सक्रिय उपभोक्ता

मैं चैनल आप शटडाउन घटना को पकड़ने और क्या यह कारण को देखने के लिए addShutdownListener() का उपयोग कर एक संदेश प्रकाशित करने के लिए उपयोग करने के लिए कोशिश कर रहे हैं पर एक ShutdownListener स्थापित करने में लगेगा निर्धारित किया है।

+6

यह पता चला है कि जब यह स्मृति से बाहर चला गया तो AMVM कनेक्शन JVM द्वारा बंद किया जा रहा था। हालांकि, किसी कारण से, चैनल बंद होने पर चैनल पर शट डाउन श्रोता फायरिंग नहीं कर रहा था। – quanticle

11

मेरे मामले में एक अन्य कारण यह था कि गलती से मैंने दो बार एक संदेश स्वीकार किया। यह दूसरी स्वीकृति के बाद इस तरह लॉग में RabbitMQ त्रुटियों का कारण बनता है।

=ERROR REPORT==== 11-Dec-2012::09:48:29 === 
connection <0.6792.0>, channel 1 - error: 
{amqp_error,precondition_failed,"unknown delivery tag 1",'basic.ack'} 

बाद मैं डुप्लीकेट रसीद फिर त्रुटियों चले गए हटा दिया और चैनल अब बंद नहीं किया है और यह भी AlreadyClosedException जा चुके थे।

+0

वह डबल एक परिदृश्य एक बहुत अच्छा बिंदु है। समस्या को देखना मुश्किल है। टिप्पणी के लिए धन्यवाद मैंने पूरी तरह से मेरी मदद की। – cramhead

4

मैं अन्य उपयोगकर्ताओं के लिए इस जानकारी ने इस विषय के लिए खोज की जाएगी जोड़ना चाहते हैं

एक चैनल बंद हो गया अपवाद प्राप्त करना के लिए एक अन्य संभावित कारण यह है कि जब प्रकाशकों और उपभोक्ताओं को अलग कतार घोषणा के साथ चैनल/कतार एक्सेस कर रहे हैं/सेटिंग्स

प्रकाशक

channel.queueDeclare("task_queue", durable, false, false, null); 

कार्यकर्ता

channel.queueDeclare("task_queue", false, false, false, null); 

RabbitMQ साइट

RabbitMQ doesn't allow you to redefine an existing queue with different parameters and will return an error to any program that tries to do that 
0

से मैं भी इस समस्या थी।मेरे मामले के लिए कारण यह है कि, पहले मैं के साथ टिकाऊ = झूठे और लॉग फ़ाइल में जब मैं सच करने के लिए टिकाऊ बंद मैं यह त्रुटि संदेश था कतार बनाया था:

"inequivalent arg 'durable' for queue 'logsQueue' in vhost '/': received 'true' but current is 'false'"

फिर, मैं कतार का नाम बदल दिया और यह मेरे लिए काम किया। मुझे लगता है कि RabbitMQ सर्वर कहीं भी निर्मित कतारों का रिकॉर्ड रखता है और यह स्थिति को टिकाऊ से गैर-टिकाऊ और इसके विपरीत बदल नहीं सकता है।

फिर मैं टिकाऊ = नई कतार के लिए झूठी बना दिया है और इस समय मैं यह त्रुटि

"inequivalent arg 'durable' for queue 'logsQueue1' in vhost '/': received 'false' but current is 'true'"

मेरे धारणा सच था मिल गया। जब मैंने rabbitMQ सर्वर में कतारों को सूचीबद्ध किया:

rabbitmqctl list_queues 

मैंने सर्वर में दोनों कतार देखीं।

संक्षेप में, 2 समाधान हैं:

rabbitmqctl stop_app 
rabbitmqctl reset 
rabbitmqctl start_app 
+0

एक बार कतार घोषित होने के बाद इसकी संपत्ति अपरिवर्तनीय है। क्यों कतार को हटाएं, फिर कतार गुणों को बदलें? एक कतार की संपत्तियों को बदलने के लिए पूरे ब्रोकर को पुनरारंभ करना थोड़ा कठोर लगता है – Daniel

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