使用celery,将async_apply发送到特定的vhost?

时间:2017-02-21 12:14:58

标签: python django celery

我有一个用例,我希望能够让许多客户端连接到RabbitMQ,但他们无法看到彼此的消息。我相信使用虚拟主机是保持工人之间隐私的最佳方式吗?

我以为我能够将virtual_host参数传递给apply_async,但这不起作用,我相信我必须像这样建立自定义连接:

from kombu import Connection

my_connection = Connection(virtual_host='new_virtual_host')

task.apply_async(connection=my_connection)

但是,我敢打赌,在Celery内部使用我已经配置的设置并通过适当的通道进行切换后端的内置方式。什么是内部“获取连接”功能?

这是使用 Celery 3.1

编辑:

目前的尝试,不起作用,似乎只是使用指定的虚拟主机返回常规连接而不是 ...

from celery.app import app_or_default
app = app_or_default()
with app.broker_connection(virtual_host='other') as new_connection:
    task.apply_async((data,), connection=new_connection)

如果我检查new_connection virtual_host kwarg被忽略了......嗯...

1 个答案:

答案 0 :(得分:2)

哈哈!因此,事实证明,Celery接受broker_url,然后忽略virtual_host,因为设置了broker_url。看起来这样做很好,手动设置我们想要的属性:

from celery.app import app_or_default

app = app_or_default()

with app.connection() as new_connection:

    # setting here instead of kwargs above
    new_connection.virtual_host = 'other' 

    task.apply_async((data,), connection=new_connection)

当我更改任何常规CELERYBROKER设置时,这样做也会适用于这些新连接 - yay!