2017-02-21 54 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設置,它將適用於這些新的連接,以及 - 耶!