2014-02-11 120 views
0

我正在使用Mule ESB 3.4。我想開發一個自定義Java組件來計算流接收到多少請求。該流程將例如是這樣的:計算騾流處理的請求

http inbound-endpoint -> counter -> vm-outbound-endpoint 

首先,包含計數器的實際變量應存儲在內存中。然後它可能會打印到日誌中或插入到數據庫中(現在不重要)。我所追求的是一種乾淨的設計,我以後可以重新使用它來存儲更​​複雜的應用程序全局狀態(根據收到的消息的數量和內容)並實現更復雜的邏輯。

+0

你有沒有嘗試過任何東西來實現呢?你遇到了什麼,如果有的話? – Pedantic

+0

不,我還沒有。我唯一能想到的就是組件類中的一個靜態變量。然而,這將使得難以從組件外部訪問它,例如來自另一個流程:/ – Guido

回答

2

解決此問題的方法是將計數器變量創建爲單例Spring bean(例如類java.util.concurrent.atomic.AtomicInteger),然後再通過Spring將其注入到自定義Mule組件中。該組件可以用原型範圍來定義,並且可以在消息每次遍歷時安全地運行諸如counter.incrementAndGet()之類的東西。以這種方式,計數器將隨時保持通過流的消息數量。

由於Spring bean可以是任何您喜歡的POJO,因此可以輕鬆擴展此設計以允許存儲更復雜的狀態。存儲的對象當然要公開線程安全的操作。

0

對於清潔和去耦方法,您可以使用服務器的通知: http://www.mulesoft.org/documentation/display/current/Mule+Server+Notifications

你只需要添加的偵聽器端點的消息,可以是一個Spring bean並存儲該值在那裏。

+0

從您發佈的鏈接「這些通知對性能有一定影響,因此默認情況下它們被禁用」。此外,我想在消息流動時訪問消息:類似於能夠保持狀態的消息觀察者。 – Guido

+0

您可以訪問通知中的消息,並且通知偵聽器實際上是您要求的。 – Seba

+0

不過,如果騾子醫生說它會對性能產生影響,我肯定這不是我想要的。 – Guido