事件系统订购问题

时间:2013-03-21 14:24:52

标签: java events design-patterns

在我目前的项目中,我们使用的事件系统无优先传播事件。我的意思是什么。问题是事件是在没有优先级的情况下调用的,因此它意味着监听类触发它们的“on message”代码,以便将它们添加到监听器容器中。

有时候难以预测难以分析的结果。

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

3 个答案:

答案 0 :(得分:2)

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

有很多解决方案:

  1. 使用finite state machine,这是迄今为止最通用,最明确的解决方案。
  2. 隔离需要按一个特定事件触发的顺序执行的进程,并以某种方式对它们进行排队,例如使用command pattern并触发事件对队列中所有命令的执行。或者使用promises也是可能的。
  3. 事件以正确的方式链接:如果ClassA需要响应事件A,但仅在ClassB完成其处理之后,则ClassA不应响应事件A,而应响应从ClassB调度的事件。最不可取的,但有时你需要快速行动。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

PriorityBlockingQueue可能对您有利。使您的Event实现Comparable,并且事件调度程序线程每次都使用最高优先级事件。