2017-02-21 26 views
1

我有一个用例,我希望能够有很多客户端连接到RabbitMQ,但他们无法看到彼此的消息。我相信使用虚拟主机是保持工作人员隐私的最佳方式?使用芹菜,发送async_apply到特定的虚拟主机?

我想我能够在一个virtual_host参数传递给apply_async但是这行不通,我相信我有做像这样自定义连接:

from kombu import Connection 

my_connection = Connection(virtual_host='new_virtual_host') 

task.apply_async(connection=my_connection) 

不过,我敢打赌,有一个使用我已经配置的设置,并在切换后端的情况下通过适当的通道来构建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_connectionvirtual_host kwarg已被忽略..嗯...

回答

1

阿哈!所以,事实证明,芹菜接受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设置,它将适用于这些新的连接,以及 - 耶!