簡體   English   中英

使用Celery,如何將Rabbitmq消息發布到另一個Docker容器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM