2011-02-18 10 views
9

मैं सेलेरी के माध्यम से Django के साथ RabbitMQ का उपयोग कर रहा हूँ। मैं सबसे बुनियादी सेटअप का उपयोग कर रहा हूं:खरगोश एमक्यू टिकाऊ कतार पर संदेश क्यों नहीं रख रहा है?

# RabbitMQ connection settings 
BROKER_HOST = 'localhost' 
BROKER_PORT = '5672' 
BROKER_USER = 'guest' 
BROKER_PASSWORD = 'guest' 
BROKER_VHOST = '/' 

मैंने एक सेलेरी कार्य आयात किया और इसे एक साल बाद चलाने के लिए कतारबद्ध किया। IPython खोल से:

In [1]: from apps.test_app.tasks import add 

In [2]: dt=datetime.datetime(2012, 2, 18, 10, 00) 

In [3]: add.apply_async((10, 6), eta=dt) 
DEBUG:amqplib:Start from server, version: 8.0, properties: {u'information': 'Licensed under the MPL. See http://www.rabbitmq.com/', u'product': 'RabbitMQ', u'version': '2.2.0', u'copyright': 'Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd.', u'platform': 'Erlang/OTP'}, mechanisms: ['PLAIN', 'AMQPLAIN'], locales: ['en_US'] 
DEBUG:amqplib:Open OK! known_hosts [] 
DEBUG:amqplib:using channel_id: 1 
DEBUG:amqplib:Channel open 
DEBUG:amqplib:Closed channel #1 
Out[3]: <AsyncResult: cfc507a1-175f-438e-acea-8c989a120ab3> 

RabbitMQ अजवाइन कतार में यह संदेश प्राप्त:

$ rabbitmqctl list_queues name messages durable 
Listing queues ... 
KTMacBook.local.celeryd.pidbox 0 false 
celery 1 true 
celeryctl_KTMacBook.local 0 true 
...done. 

मैं तो नियंत्रण सी 'एक' निरस्त करने के बाद मारकर RabbitMQ को मार डाला। जब मैं सर्वर फिर से शुरू करने और rabbitmqctl के साथ की जाँच करें, यह कहता है अजवाइन कतार में कोई संदेश नहीं देखते हैं कि:

$ rabbitmqctl list_queues name messages durable 
Listing queues ... 
celery 0 true 
celeryctl_KTMacBook.local 0 true 
...done. 

अजवाइन कतार टिकाऊ था। संदेश क्यों नहीं बने रहे? संदेशों को लगातार बनाने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

5

संदेशों delivery_mode आप इसे उपभोग करते हैं और संदेश गुण देख सकते हैं पता लगाने के लिए:

>>> from tasks import add 
>>> add.delay(2, 2) 

>>> from celery import current_app 
>>> conn = current_app.broker_connection() 
>>> consumer = current_app.amqp.get_task_consumer(conn) 

>>> messages = [] 
>>> def callback(body, message): 
...  messages.append(message) 
>>> consumer.register_callback(callback) 
>>> consumer.consume() 

>>> conn.drain_events(timeout=1) 

>>> messages[0].properties 
>>> messages[0].properties 
{'application_headers': {}, 'delivery_mode': 2, 'content_encoding': u'binary', 'content_type': u'application/x-python-serialize'} 
+2

मैंने पुष्टि की कि डिलीवरी मोड 2 पर सेट किया गया था। मैं इसे RabbitMQ को 2.3.1 में अपग्रेड करके काम करने में सक्षम था। RabbitMQ 2.2.0 का उपयोग करते समय मुझे दृढ़ता की समस्याएं मिल रही थीं। – hekevintran

19

एक कतार टिकाऊ बनाना इसे लगातार संदेश बनाने जैसा नहीं है। टिकाऊ कतार का मतलब है कि जब सर्वर पुनरारंभ होता है तो वे स्वचालित रूप से फिर से आते हैं - जो आपके मामले में स्पष्ट रूप से हुआ है। लेकिन यह स्वयं संदेशों को प्रभावित नहीं करता है।

संदेश लगातार बनाने के लिए, आपको संदेश की delivery_mode संपत्ति को 2 पर भी चिह्नित करना होगा। पूर्ण स्पष्टीकरण के लिए क्लासिक लेखन-अप Rabbits and Warrens देखें।

संपादित करें: पूर्ण लिंक टूटी हुई है, लेकिन दिसंबर 2013 के रूप में आप अभी भी मुख्य यूआरएल से ब्लॉग पोस्ट को मिल सकता है: http://blogs.digitar.com/jjww/

+0

ऐसा लगता है कि वितरण मोड पहले से ही 2 के लिए सेट है जैसे: add.delivery_mode == 2. यह डिफ़ॉल्ट अजवाइन के रूप तक मुझे पता है बदला नहीं जा सकता। – hekevintran

+0

क्या कोई तरीका है कि मैं अपने डिलीवरी मोड की जांच करने के लिए संदेश का निरीक्षण कर सकता हूं? – hekevintran

+0

क्या आप कांबू का संस्करण उपयोग कर रहे हैं? (सेलेरी द्वारा उपयोग किया जाता है) कोम्बू 1.0.0 में एक बग था जहां संदेश delivery_mode सही ढंग से सेट नहीं किया गया था। – asksol

0

आप बस (अन्य उत्तर में से एक में से अधिक) अपनी टिप्पणी typo'd हो सकता है, लेकिन सिर्फ मामले में: लाइन

add.delivery_mode == 2 

delivery_mode मान सेट करें, क्योंकि == पायथन में दो संख्याओं की तुलना करता है; यह = है जो वास्तव में असाइनमेंट ऑपरेटर है। तो आपके द्वारा उद्धृत बयान delivery_mode से 2 की तुलना करता है, और उसके बाद True या (सबसे अधिक संभावना) False परिणाम निकाल देता है। वास्तव में एक मूल्य, उपयोग करने के लिए:

add.delivery_mode = 2 
+1

वह जानबूझकर था। मैं पुष्टि कर रहा था कि संदेश की delivery_mode विशेषता 2 के बराबर थी। मैं इसे सेट करने की कोशिश नहीं कर रहा था :) – hekevintran

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

  • कोई संबंधित समस्या नहीं^_^