java中的轻量级发布/订阅框架

有一个很好的轻量级框架的Java提供发布/订阅模式?

一些理想的function

  • 支持generics
  • 将多个订阅者注册到发布者
  • API主要是接口和一些有用的实现
  • 纯粹是在内存中,不需要持久性和交易保证。

我知道JMS,但是这对我的需要来说是过度的。 发布/订阅的数据是文件系统扫描的结果,扫描结果被送到另一个组件进行处理,然后在被送到另一个组件之前被处理,等等。

编辑:所有在同一个进程内。 来自bean的PropertyChangeListener并没有完全削减它,因为它报告属性的变化,而不是发布特定的项目。 我可以通过拥有一个“上次发布的对象”属性以及发布的对象来使得ProprtyChangeListener工作。 PropertyChangeListeners不支持generics,而是根据属性更改语义,而不是纯粹的发布/订阅。 java.util Observer / Observable模式会很好,但是Oberver是一个具体的类。

JMS与您configuration一样轻或重。 我们在一个项目中使用HornetQ例如内存队列。 它很容易设置,不需要任何基于JNDI的configuration,而且非常易于使用。

我相信JMS作为Message Pub / Sub的API是非常容易的。 (并不容易;)

看来这符合要求:

来自Google Guava Library的EventBus – “组件之间的发布 – 订阅式通信,而不需要组件相互明确地注册” 。 它也可以是一个将在另一个线程上分派事件的AsyncEventBus 。

一些额外的select要考虑:

  1. 如果在相同的过程中,可以使用Observer模式。 订户可以添加监听器并接收事件通知。 Observable已经是Java API的一部分。

  2. FFMQ是一个完整的Java 轻量级快速JMS 1.1队列实现。

既然你在使用Spring,我不知道你是否知道Spring有它自己的轻量级事件框架 。 它主要在框架内部使用,但是应用程序代码完全可以使用它。

默认情况下,它是同步的pub / sub,但可以使用ApplicationEventMulticaster使其asynchronous。

我认为骆驼也是一个很好的候选人。 特别是发布 – 订阅模式

骆驼可以被embedded并且是轻量级的。 它提出了企业集成模式 – 许多有用的集成工具,在应用程序内部甚至与其他angular色(因此,“集成”)。

它比较弹簧集成,但更完整的国际海事组织。

如果你跨越过程边界,那么就会产生某种程度的“重量”。 你为什么说JMS是重量级的? 这个API很简单? 有人认为轻量级的实现,例如链接文本较重的成本,如持久性和交易性是可选的。

你需要什么比这更轻?

Bob Lee在http://snipt.org/GWm/上有一个;QueueFile类,您可能会感兴趣。 这是一个简单的持久队列,可以被多个消费者使用。 这听起来像你不需要持久性,但由于整个事情是如此轻量级,它仍然可以是有用的。