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

12-08-23 selayou
多个消费者都有返回值时

@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

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

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

selayou
2012-08-23 21:09
还有问,不知道返回的结果是根据什么规则,最先返回的,还是最后返回的

banq
2012-08-23 21:11
最后返回。

selayou
2012-08-24 10:52
我测试了下,但是还是最先返回的那个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的结果

banq
2012-08-24 18:50
在并行环境下,返回可能无法确定,可能不能返回多个,只能返回一个。

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

banq
2012-08-25 18:21
可以考虑一下,返回多个结果,是否涉及聚合?fork/join或Map/reduce算法?

[该贴被banq于2012-08-25 18:22修改过]

[该贴被banq于2012-08-25 18:22修改过]

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

selayou
2012-08-27 09:32
我看了结果处理方式,多个消费者需要增加wateAtSequence,这个需要计算返回结果的消费者有多少。我想是否可以在@Consumer中增加个属性,譬如returnResult,计算方便。

另外一个增加个Order属性,指明在topic的消费者中的位置,默认的按照getClass排序。是不是要改成按getSimpleClassName呢,package名称包含在里面?

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

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

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

猜你喜欢