2017-01-22 42 views
1

我有一個網站和一個webjob,其中網站是單向客戶端,webjob是worker。Rebus - 將延遲的消息發送到另一個隊列(Azure ServiceBus)

我使用Azure ServiceBus傳輸作爲隊列。

我得到以下錯誤:

InvalidOperationException: Cannot use ourselves as timeout manager because we're a one-way client

當我嘗試從網站總線發送Bus.Defer。

由於Azure Servicebus內置了對timeoutmanager的支持,因此不應該從單向客戶端的這個工作事件?

Bus.Defer上的文檔說:通過給它添加一個頭並把它傳遞到配置的超時管理器端點012////(默認是我們自己)來延遲郵件的傳遞。當時間是正確的,推遲的消息被返回到由標題所指示的地址「

我能否通過設置這樣的returnAddress的解決這個問題。

headers.Add(Rebus.Messages.Headers.ReturnAddress, "webjob-worker"); 

回答

0

Could I fix this by setting the ReturnAddress like this: headers.Add(Rebus.Messages.Headers.ReturnAddress, "webjob-worker");

是:)

問題是這樣的:當你await bus.Defer與滷麪的消息,則默認爲消息返回到發送的輸入隊列

當你是一個娃。 y客戶端,您沒有輸入隊列,因此在超時過後,您無法接收消息。

設置返回地址修復了這個問題,雖然我承認這個解決方案並不完美。一個更好的API是,如果滷麪對路由的API,它可以被稱爲像這樣的Defer方法:

var routingApi = bus.Advanced.Routing; 

await routingApi.Defer(recipient, TimeSpan.FromSeconds(10), message); 

但遺憾的是它並沒有在目前這個方法。

總結:是的,在延遲消息上顯式設置返回地址使得單向客戶端能夠推遲消息。

+0

這是可以添加到Rebus中的功能嗎?如果是這樣,我應該在GitHub倉庫中創建一個問題? –

+0

嗯,我想過 - 但後來我懷疑它應該被添加到什麼地方,也想知道該怎麼稱呼它.....現在,我建議你通過在'IBus'上創建擴展方法來添加它。接受目標隊列作爲參數 – mookid8000

相關問題