2017-07-27 91 views
2

我有一個正在從MSMQ中接收消息的BizTalk業務流程。它處理消息並將其發送到另一個系統。如何使BizTalk只從MSMQ接收一條消息

問題是,無論何時將消息放入隊列中,即使它仍在處理先前的消息,BizTalk也會立即將其退出。這是一個真正的痛苦,因爲如果我重新啓動編排,那麼所有未處理的消息都會被刪除。

是否有任何方法可以使BizTalk一次只收取一條消息,以便它在完成下一條消息之前完全處理消息?

對不起,如果這是一個明顯的問題,我已經繼承了BizTalk系統,並且無法在線找到答案。

+0

你能解釋一下您更多的痛點位?重新啓動業務流程是什麼意思?它是否重新啓動主機實例?它不應該導致任何消息丟失。由於其他潛在問題,您似乎希望引入此類處理。 –

回答

0

雖然您可以使用Ordered Delivery按順序處理郵件,但無法序列化爲您要求的方式。

但是,僅僅停止Orchestration不應該刪除任何內容,更不用說「所有未處理的消息」。似乎這是你的問題。

您應該能夠停止處理而不會丟失任何東西。

如果業務流程是進入一個暫停狀態,那麼所有你需要做的是恢復一個編排和排隊將保持和處理的任何消息。這將是默認行爲,即使應用程序是正確創建的)。

停止應用程序時,實際上是終止現有的編排以及與其關聯的所有內容,包括任何排隊的消息。

這是您的潛在問題,如果原始開發人員未正確處理端口錯誤,那麼編排可能會陷入不可修復的循環中。這將需要一個(很小)的編配本身。

+0

我懷疑代碼寫得不好,但我們只是支持應用程序,我們不再有任何技能來修改代碼。有時我們會重複失敗(例如,因爲下游系統沒有響應),並且編排會記錄一條消息,指出它已掛起,我們需要重新啓動編排。當我們這樣做時,它會再次開始工作,但是它從隊列中移除的所有未處理的消息都會被刪除。 –

+0

我們通過重新啓動應用程序來完成此操作。我剛剛看過,其實似乎我們可以重新啓動編排?我們應該這樣做嗎? –

+0

@ChrisWignall根據評論更新答案。 –

1

有在BizTalk MSMQ適配器的三個屬性,你可以嘗試與周圍玩:

BATCHSIZE

指定適配器將起飛隊列在一個時間消息的數量。默認值爲20.

這可能會幫助您,也可能不會幫助您。即使設置爲1,我懷疑BTS會嘗試同時消耗剩餘的「單個」消息,因爲它總是會嘗試並行處理,但我可能是錯誤的。

serialProcessing

指定的消息在他們入隊的順序出隊。默認值是false。

這更有可能起到幫助作用,因爲要保證有序處理,您基本上僅限於單線程處理。但是,我不確定這是否足夠,或者它只會調解消息傳遞到消息箱數據庫的順序。您可能需要在整個BTS應用程序中啓用有序傳送,這隻能在設計時完成(即需要更改代碼)。

事務

指定消息將作爲DTC事務的一部分被髮送到消息框數據庫。默認值是false。

這可能有助於解決消息「迷路」時的其他問題。如果隊列是非事務性的,而且沒有列入到達消息框DB的較大事務範圍中,那麼如果消息出列但未處理,則會導致消息丟失。通過使整個過程成爲原子,任何未提交給消息框的消息都將回滾到隊列中。

來源: https://msdn.microsoft.com/en-us/library/aa578644.aspx