我即将开始一个小型的Java(实际上是GWT)项目,目前处于“信息收集”阶段。
问题:是否有用Java编写的轻量级消息总线库?
我的要求也很轻量级 :-)
- 异步(无需同步)
- 多播和点对点
- 没有严格的消息排序
- 消息“包裹”最好由消息总线“拥有”(即在生命周期管理方面)
- 本地化交付(即不是进程间或节点间交付)
更新:看起来GWT现在支持一个集成的"事件总线"。
我知道这是一个旧问题,但我认为更现代的解决方案是使用Guava事件总线(虽然我不确定它是否适用于GWT,但您的标题和标签都没有提到GWT)。
实际上,我有一个自定义的RabbitMQ简单消息容器,它会自动创建队列绑定,并在接收到消息后将其分派到Guava事件总线。它非常优雅,并且可以很好地扩展。
您可以轻松使用DI框架来注册订阅者。对于Spring,我创建了一个BeanPostProcessor,它会自动使用@Subscribe
注册bean。
以下是Spring BeanPostProcessor:
package com.snaphop.spring;
import java.lang.reflect.Method;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
@Component
public class EventBusBeanPostProcessor implements BeanPostProcessor {
private EventBus eventBus;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (isApplicable(bean)) {
eventBus.register(bean);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
protected boolean isApplicable(Object bean) {
for(Method m : bean.getClass().getMethods()) {
if (m.isAnnotationPresent(Subscribe.class))
return true;
}
return false;
}
@Autowired
public void setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
}
}
我相信在Guice中做类似的事情是很简单的。
TaskExecutor
框架,这意味着它们可以根据需要进行同步或异步。此外,每个ApplicationContext
都有一个publishEvent
方法,因此轻松设置为Spring管理的类。
所以,如果您已经使用Spring,则无需另一个实用程序来执行此操作,因为它已经内置了。
不确定它是否真的很轻量级。但它确实符合您的其余描述:ActiveMQ