2014-10-08 77 views
0

我有一個需求,我需要確保一次只有一個消息正在被騾流處理。流程由石英調度程序觸發,該程序讀取一個文件從FTP服務器每次如何判斷是否正在進行騾流消息處理

我建議的解決方案是保持一個全局變量「FLOW_STATUS」,當收到一條消息時將被設置爲「RUNNING」,並且一旦完成消息處理就會被重置爲「STOPPED」。

如果「FLOW_STATUS」爲「正在運行」,任何送到流程的消息都將檢查此變量並中止。

此設置似乎正在工作,但我想知道是否有更好的方法來做到這一點。

有沒有解決這個或任何內置騾子輔助功能的最佳做法來實現的,而不是依賴於全局變量

回答

1

這似乎是一個更簡單的解決辦法是設置maxActiveThreads的流1相同。在Mule中,每個處理的消息都得到它自己的線程。因此,將maxActiveThreads設置爲1將有效地使您的流單線程化。其他待處理的請求將在接收者線程中等待。您將需要確保您的接收器線程池足夠大以容納所有可能的等待線程。這可能意味着限制您的石英調度程序,以允許時間處理文件,以便接收器線程池不會填滿。有關線程池以及如何調優性能的更多信息,請訪問以下鏈接:http://www.mulesoft.org/documentation/display/current/Tuning+Performance

+0

感謝Matt!。這意味着我的流處理應該是同步的,以便只有在所有處理完成後才能釋放接收者線程。我正在使用VM隊列來利用我的流程中的羣集。我相信最終會在 – 2014-10-08 21:55:58

+0

的早期釋放接收者線程。Mule將爲每個流使用三個線程池。接收器池,處理池和調度池。當新消息進入流的Mule服務器時,會爲該消息啓動一個新的接收者線程。如果接收器池中沒有剩餘線程,則服務器將阻塞並等待一個線程。那時你開始有性能問題。接收器池中的線程將等待處理池中的線程打開,然後傳遞消息進行處理。在集羣環境中,Mule將在集羣中的任何可用服務器上查找線程。 – 2014-10-09 12:49:00

+0

我必須鎖定流程,直到消息處理完成。由於我在兩者之間使用虛擬機隊列,因此我假定接收方線程會將消息移交給處理池中的虛擬機隊列的線程,並返回到接收方池。這意味着服務器可以使用該線程接收另一條消息,而之前的消息處理仍在進行中。因此,對於接收者線程配置文件,maxActiveThreads = 1不會對我的用例產生幫助。如果我的假設錯誤,請糾正我。我猜測使用全局變量是唯一的方法。 – 2014-10-09 17:26:43

相關問題