2010-07-06 31 views
0

我有一種情況,主業務流程負責處理消息隊伍。這些消息屬於一組客戶,編排會在消息進入時讀取這些消息,並且對於它找到的每個新客戶ID,都會啓動一個新的編排,負責處理特定客戶的消息。我必須保留消息進入時的順序,所以新創建的業務流程應該處理它所具有的消息,並等待來自主業務流程的其他消息。從父業務流程開始多個業務流程並將消息傳遞給它們

嘗試了不同的方法來解決這個問題,但無法成功實施它。 我想聽聽你如何做到這一點的意見。

謝謝。

回答

0

這聽起來像你想要的是一組嵌套的車隊。雖然有可能實現這一目標,但它會......受到傷害。特別是,我的第一個擔心是維護:對流程的任何改變都會讓我們感到痛苦,更糟的是,部署真的會非常糟糕。

就我個人而言,我真的會嘗試找到一種替代方法來實現這一點,並儘可能避免車隊,但這將取決於您的具體情況。

的幾個問題,如果你不介意:

  • 什麼是你的排序要求?例如,您是否只需要針對單個入局批次或跨批次的每個客戶進行有序處理?如果是後者,你是否可以在沒有主控協調的情況下做到這一點,並且只爲每個客戶強制一個車隊實例?仍然不是很好,但可能會簡化很多事情。

  • 您在訂購方面的失敗要求是什麼?它應該完全停止處理嗎?保存消息並繼續?怎麼樣重試?

  • 僅僅根據消息的到達時間進行排序?消息中是否有任何內容可用於在內部強制排序,而不是純粹依賴到達時間?

  • 單個消息的處理是做什麼的?排序要求僅用於確保在處理特定消息時滿足某些先決條件(例如,消息表示某些樹結構,要求父項在子項之前處理)。

0

我不認爲你需要一個主流協調來啓動子流程。我不是在談論實施車隊模式的主流協調。所以,如果是這樣的話,我可能會這樣做。

關於如何實現單體流程的簡單示例here。本示例顯示如何設置僅存在一次的業務流程。所有發送給它的消息將按照接收的順序排列並一次處理一個消息。您的示例不同之處在於您希望通過客戶ID完成此操作。這很簡單。在入站消息中提升客戶ID並將其添加到關聯類型。現在,每個客戶只會有一個實例的編排。

單身人士的問題是這樣的。你必須在某個時候殺死他們,否則他們將永遠活在脫水的管絃樂隊中。所以,你需要讓它們結束。如果有一種方法可以讓給定客戶的最後一條消息通知業務流程,說明是時候通過某個屬性或某個屬性去死亡,那麼可以這樣做。如果這是不可能的,那麼你需要設置一個計時器。如果在x秒內沒有收到消息,終止orch。這很容易做到,但它可以引入殭屍。殭屍發生在當該客戶的另一條消息進入時關閉的過程中,這通常可以通過縮短等待時間來解決。無論如何,它會造成偶爾的殭屍。

從他的領域的筆記。我們已經做到了這一點,這真的不是一個很好的長期解決方案。我們正在接收客戶信息更新,並且我們必須確保有序處理。我們做了這種單例方法,從殭屍問題和解決問題中解決問題。如果Singleton業務流程引發異常,它將阻止處理該客戶未來的所有消息。所以 - 處理每一個可能的例外。真正的解決辦法是讓遠端系統檢查更新消息中的時間戳,並丟棄比上次更新更早的時間戳。我們想這樣做,但接收系統不想做這些額外的工作。

+0

謝謝克里斯。我以不同的方式結束了這一過程。仍然使用單個業務流程來接收消息並開始新的業務流程,但沒有啓動業務流程形狀。我需要這種主流編排,因爲我需要根據收到的消息中的數據啓動不同的子流程。 – 2010-07-12 08:25:25

+0

您是如何處理有序處理的? – 2010-07-12 15:35:32