如何在jdonframework中实现EventBus?

读了banq老师的<<依赖注入与事件编程 >>一帖,觉得模型注入事件总线这种做法很自然,想自己在jdonframework中实现EventBus,不知如何下手,请banq老师指教!
[该贴被admin于2013-03-26 17:14修改过]

建议在Jdon框架的事件消费者中实现:


@Component
public class ShortMessageHandler {

protected final ShortMessageFactory factory;

private AsyncEventBus eventBus;

public ShortMessageHandler(ShortMessageFactory factory, ScheduledExecutorUtil scheduledExecutorUtil) {
super();
this.factory = factory;
eventBus = new AsyncEventBus(scheduledExecutorUtil.getScheduExec());
eventBus.register(this);
}

@OnEvent("atUserNotifiedEvent") //这是Jdon的事件响应器
public void notifyATUser(ATUserNotifiedEvent event) throws Exception {
eventBus.post(event);

}

@Subscribe
//这是Guava的事件响应器
public void notifyATUserAction(ATUserNotifiedEvent event) throws Exception {
factory.createWeiBoShortMessage(event);

}

}

以上是一个事件消费者的普通组件的代码,执行顺序是:先并发执行notifyATUser方法,然后异步线程的方式执行notifyATUserAction,这两者区别是:前者并发不管当前CPU负载情况,马上执行,后者使用的JDK Executor重启一个线程执行,如果当前CPU高,可能会推迟执行。

事件发送者代码如下:


@Introduce("message")
public class ShortMPublisherRole {

@Send(
"atUserNotifiedEvent")
public DomainMessage notifyATUser(ATUserNotifiedEvent event) {
return new DomainMessage(event);
}
}

领域模型中要使用这个事件发送者,只要在代码中加入:


public class MyModel{
@inject
ShortMPublisherRole shortMPublisherRole;

}

这是通过Jdon框架提供的领域事件再使用eventbus。执行顺序是:
MyModel --->发出事件 --- >ShortMPublisherRole --->ShortMessageHandler的OnEvent--->ShortMessageHandler的Guava的Subscribe

如果想在模型中直接使用Guava,那么如同普通POJO一样,在构造函数中注册:


public class MyModel{
EventBus eventBus;
public MyModel (){
eventBus = new EventBus();
eventBus.register(new ShortMessageHandler())
}
}


[该贴被banq于2013-03-26 17:28修改过]

我感觉这种做法不太自然,并不是所有事件都要通过Role转发,且disruptor-->guava的这种转发也不自然,如果能注入一个全局的EventBus做为路由,我们只要把事件往里面扔,那就再好不过了。但如果采用GUAVA的EventBus我们就用不了Disruptor带来的好处,jdonframework能否为我们提供一个EventBus?
[该贴被fengweili于2013-03-27 12:22修改过]