2010-06-13 79 views
43

是否有一個良好的輕量級框架,用於提供發佈/訂閱模式的java?java中的輕量級發佈/訂閱框架

一些理想特徵

  • 泛型支持
  • 登記多個用戶的給出版商
  • API主要接口和一些有用的實現純粹的內存中,持久性和事務保證不需要

我知道關於JMS,但這對我的需要是過度的。發佈/訂閱數據是文件系統掃描的結果,掃描結果被傳送到另一個組件進行處理,然後在被傳送到另一個組件之前進行處理,等等。編號: 所有在同一個過程中。來自bean的PropertyChangeListener並沒有完全削減它,因爲它報告屬性的變化,而不是發佈特定的項目。我可以通過擁有「上次發佈的對象」屬性和發佈的對象來強化ProprtyChangeListener。 PropertyChangeListeners不支持泛型,並且在屬性更改語義中固化,而不是純粹的發佈/訂閱。 java.util Observer/Observable模式會很好,但Oberver是一個具體的類。

+0

在一個過程中?還是跨越許多流程和機器? – djna 2010-06-13 15:58:14

+0

在一個過程中。 – mdma 2010-06-13 16:44:02

+0

這是一個Spring應用程序嗎? – skaffman 2010-06-13 16:50:36

回答

13

JMS與您配置時一樣輕或重。我們在一個帶有內存隊列的項目中使用例如HornetQ。它很容易設置,不需要任何基於JNDI的配置,而且非常易於使用。

我相信JMS作爲Message Pub/Sub的API非常簡單。 (並不容易;)

+1

實際上...對於發佈/訂閱aka觀察者模式,最簡單和最基本的東西是... javax.beans包。 ;)(PropertyChangeListener,PropertyChangeEvent,PropertyChangeSupport ...) – user268396 2010-06-13 16:13:59

+0

@ user268396,夠公平的。對於簡單的POJO狀態更改pub/sub JavaBeans屬性的偵聽更簡單。 – 2010-06-13 16:21:47

+0

@ user268396 - 我很害怕PropertyChangeListener不適合這裏。查看我的編輯原因。 – mdma 2010-06-13 16:59:33

0

如果您正在穿越流程邊界,那麼會產生某種程度的「重量」。你爲什麼說JMS是重量級的? API非常簡單?有人認爲輕量級的實現,例如link text較重的成本,如持久性和交易性是可選的。

你需要什麼,比這更輕?

6

既然你使用Spring,我不知道你是否知道Spring有它自己的lightweight event framework。它主要用於框架本身,但它完全可以被應用程序代碼使用。

默認情況下,它是同步pub/sub,但可以使用ApplicationEventMulticaster使其異步。

0

鮑勃李有一個QueueFile類在http://snipt.org/GWm/,你可能會覺得有趣。這是一個簡單的持久隊列,可供多個消費者使用。這聽起來像你不需要持久性,但是由於整個事情是如此輕量級,它仍然可以是有用的。

+0

你可以從這裏訪問最新的實現:https://github.com/square/tape/blob/master/tape/src/main/java/com/squareup/tape/QueueFile.java – ozhan 2012-10-20 17:07:44

24

看來這符合要求:

EventBus從谷歌番石榴圖書館 - 「發佈 - 訂閱式通信組件之間不需要的組件來明確彼此註冊」。它也可以是將在另一個線程上分派事件的AsyncEventBus

一些額外的選項來考慮:

  1. 如果是在同一個進程有可能可以使用Observer模式。訂戶可以添加監聽器並接收事件通知。 Observable已經是Java API的一部分。快速JMS 1.1隊列實現。這是一個完整的Java,輕量級,快速JMS 1.1隊列實現。

+1

觀察者模式似乎意味着知識的可觀察性和觀察者,而真正的發佈/訂閱允許代碼獨立性。來自番石榴的EventBus看起來更好。 – unludo 2013-05-06 08:42:27

1

我認爲Camel也是一個很好的候選人。特別是與publish-subscribe pattern

駱駝可以嵌入,是輕量級的。它提出了企業集成模式 - 許多有用的集成工具,在應用程序內部甚至與其他角色(因此是'集成')。

它與Spring Integration相比,但更完整的國際海事組織。