2013-03-21 68 views
1

在我当前的项目中,我们使用事件系统来传播没有优先级的事件。我的意思是。问题在于没有优先级调用事件,所以它意味着监听类将它们添加到侦听器容器中以激发他们的“消息”代码。事件系统订购问题

它可能会导致分析结果有时难以预测。

您是否知道任何现有解决方案能够以“好方法”处理事件的排序?

回答

2

优先事件是地狱之路。没有字面意思。 您需要跟踪哪些对象需要什么优先级。那么你会用完优先事项。接下来你意识到你已经将相同的依赖关系(优先级常量类)硬编码到了100个类中,并且将它们全部绑定在一起。也许不是,但是陷阱很多,而不是幽默。 你必须看看你想实现什么: 你想要订购流程执行顺序。除了完全任意的事实,即事件触发这些过程外,它与事件无关。

解决方法有很多:

  1. 使用finite state machine,目前最通用的和明确的解决方案。
  2. 隔离需要执行的进程,按顺序触发某个特定事件并以某种方式对它们进行排队,例如使用command pattern并通过该事件触发队列中所有命令的执行。或者使用promises也是可能的。
  3. 事件链接正确的方式:如果ClassA需要响应事件A,但只有在ClassB完成其处理后,ClassA才会响应事件A,而不是响应ClassB调度的事件。最不喜欢的,但有时候你需要快点。
1

在监听器类中添加一个排序依赖标志。这是假设监听者A被调用,它对监听者B有依赖性,然后让B首先执行。同样,您可以在所有监听器类中放置依赖条件,从而创建所需的层次结构。

只要确保您不要添加循环依赖或仔细处理它。

1

PriorityBlockingQueue可能会帮你。使你的事件实现可比较,并且事件分派器线程每次都消耗最高优先级的事件。