多个消费者都有返回值时,报错

多个消费者都有返回值时
@Consuemr("topic")
ConsumerA{

Onevent(EventDisruptor Event boolean endofbantch){
event.getDomainmEssage().setEventResult(result);
}

}
@Consumer("topic")
ConsumerB{

Onevent(EventDisruptor Event boolean endofbantch){
event.getDomainmEssage().setEventResult(result);
}

}
两个Consumer都是“topic”的消费者,每个都返回执行结果result,后面一个会报错!
麻烦banq回答下
thanks a lot

2012-08-23 10:38 "@selayou"的内容
两个Consumer都是“topic”的消费者,每个都返回执行结果result,后面一个会报错 ...

一个bug,到git下载最新版本即可

还有问,不知道返回的结果是根据什么规则,最先返回的,还是最后返回的

最后返回。

我测试了下,但是还是最先返回的那个Consumer的结果。在DisruptorFactoryTest


public void testGetDisruptor() {
TreeSet<DomainEventHandler> handlers = disruptorFactory.getTreeSet();
final DomainEventHandler<EventDisruptor> handler = new DomainEventHandler<EventDisruptor>() {


public void onEvent(EventDisruptor event, final boolean endOfBatch) throws Exception {
System.out.println("MyEventA=" + event.getDomainMessage().getEventSource());
event.getDomainMessage().setEventResult(11111 + (Long) event.getDomainMessage().getEventSource());

}
};

final DomainEventHandler<EventDisruptor> handler2 = new DomainEventHandler<EventDisruptor>() {


public void onEvent(EventDisruptor event, final boolean endOfBatch) throws Exception {
System.out.println("MyEventA=" + event.getDomainMessage().getEventSource());
event.getDomainMessage().setEventResult(22222 + (Long) event.getDomainMessage().getEventSource());

}
};
handlers.add(handler2);
handlers.add(handler);

因为按照类名排序的,handler总是排在前面,类名com.jdon.async.disruptor.DisruptorFactoryTest$1,
handler2总是排在后面类名是com.jdon.async.disruptor.DisruptorFactoryTest$2

返回的总是hander的结果

在并行环境下,返回可能无法确定,可能不能返回多个,只能返回一个。

是返回一个,我测试的结果是谁排在前面,返回谁的结果。要是返回最后一个Consumer的结果,就没问题了,能不能找下原因呢?再看看接收结果的过程

可以考虑一下,返回多个结果,是否涉及聚合?fork/join或Map/reduce算法?
[该贴被banq于2012-08-25 18:22修改过]
[该贴被banq于2012-08-25 18:22修改过]

我原来是这样考虑的: 顺序和并行区别是堵塞,为什么要堵塞,因为顺序需要方法的返回结果,从一个角度说,编写没有返回结果的功能方法可能最有利于并发。

我看了结果处理方式,多个消费者需要增加wateAtSequence,这个需要计算返回结果的消费者有多少。我想是否可以在@Consumer中增加个属性,譬如returnResult,计算方便。
另外一个增加个Order属性,指明在topic的消费者中的位置,默认的按照getClass排序。是不是要改成按getSimpleClassName呢,package名称包含在里面?


2012-08-27 09:32 "@selayou"的内容
是不是要改成按getSimpleClassName呢,package名称包含在里面 ...

是全名包括包,一般一个领域模型的所有@Consumer放在一个包下,比较好确认。

另外关于返回结果的问题,参考这篇文章:命令是fire-and-forget的,命令一般是不返回结果的,如果要返回,只是确认接受到的结果,是一种幂等结果,可以多次执行但是返回结果都是相同的,基于这些约束,所以jdon对返回结果多个上有保留和迟疑的,如果你确实重视多个消费者返回结果,是不是有误用异步事件模型的可能,可以使用fork/join或传统同步方式获得。