如何在jdonframework中实现EventBus?

13-03-26 fengweili
读了banq老师的<<依赖注入与事件编程 >>一帖,觉得模型注入事件总线这种做法很自然,想自己在jdonframework中实现EventBus,不知如何下手,请banq老师指教!

[该贴被admin于2013-03-26 17:14修改过]

    

banq
2013-03-26 17:24
建议在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);

	}

}
<p>

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

事件发送者代码如下:

@Introduce("message")
public class ShortMPublisherRole {

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

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

public class MyModel{
  @inject
  ShortMPublisherRole shortMPublisherRole;

}
<p>

这是通过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())
    }
}
<p>

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

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

[该贴被fengweili于2013-03-27 12:22修改过]

猜你喜欢