[英]Using Celery, how do I post rabbitmq messages to another docker container?
看來我的celery工作者在mymachine.domain.com:port上啟動並正確連接,兔子mq駐留在單獨的docker容器中。
但是,當我從Web應用程序調用函數apply_async時,即使它應使用相同的django src / settings.py文件,該文件也將再次為mymachine.domain.com:port,它會嘗試在localhost:port上進行連接。
我可以使它起作用的唯一方法是將docker network_mode設置為'host'。 盡管出於安全原因,這不是可接受的模式。
這是我的celery.py文件:
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE','src.settings')
import django
django.setup()
from src.apps.main.tasks import cleanup, syncldap
app = Celery('myappcelery', backend='amqp',
# Expected next line isn't even used because line with 'django.conf:settings' will override it with the config settings.
broker='amqp://user@mymachine.domain.com:5672//', include=['src.apps.appname.tasks'])
app.config_from_object('django.conf:settings',
app.autodiscover_tasks()
這是我的src.settings.py文件設置:
CELERY_BROKER_URL = 'amqp://user:password@mymachine.domain.com:5672//'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_DEFAULT_QUEUE = 'celery'
我將打印語句添加到以下已安裝的文件文件中:site-packages / kombu / connection.py
在函數中:
def default_channel(self):
我添加了以下打印語句:
print "Connection %s" % self.connect
從我的芹菜工作者那里,我在日志中看到以下內容:
Connection <bound method Connection.connect of <Connection: amqp://<user>:**@mymachine.domain.com:5672// at 0x7fd1e3700450>>
但是,當我嘗試調用apply_async時,我看到以下消息,並且它只是掛起:
Connection <bound method Connection.connect of <Connection: amqp://<user>:**@localhost:5672// at 0x7fc01371bc50>>
其中localhost是Web應用程序的docker容器,將無法正確連接到位於主機上的Rabbit MQ。 這解釋了為什么在主機模式下它可以工作,因為那時Rabbitmq和Web容器的localhost:5672相同。 但是在橋接模式下,您無法使用localhost訪問主機,這就是為什么我在配置中指定主機名的原因。 我不確定為什么這會覆蓋回本地主機。
另外,當我運行芹菜工人時,也是來自同一台具有相同配置文件的機器,但是我添加的打印語句顯示了正確的主機。
看來我也需要在我的task.py文件中實例化應用程序。
之前
@task(name='func_name', bind=True)
def func_name(self, id)
后
app = Celery('celery', backend='amqp',
broker='amqp://user@mymachine.domain.com:5672//')
@app.task(name='func_name', bind=True)
def func_name(self, id)
從功能autodiscover_tasks將它們導入celery.py時,它會加載應用程序配置。 但是,當從Web加載時,直到我將其添加之前,它才引用配置,因此它使用的是默認的localhost。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.