2

我管理一组客户端提供的事件接收器,每个接收器都订阅自己的事件流。每个接收器通常会将数据推送到自己的网络管道中,这意味着将事件推送到接收器时存在可利用的并发性。同时我需要确保正确的事件排序。这是一种天真的方法:


final Set<Sink> sinks = new HashSet<>();
final ExecutorService pool = Executors.newCachedThreadPool();

eventSource.addListener(new SourceListener() { 
  public void sourceEvent(final Event event) {
    final Sink sink = resolveSink(sinks, event);
    pool.submit(new Runnable() { public void run() { sink.accept(event); }});
}});

这不能保证正确订购。如果我的线程池将每个事件队列与单个线程相关联并将我的接受事件任务分派到该特定线程的任务队列,这将是健壮的。我正在寻找一个基本想法或可行方法的草图。

4

2 回答 2

3

如果您的意思是每个事件都Sink应该按照它们发生的顺序处理事件,那么这正是Actor 模型的应用。存在许多用 Java 实现的 Actor 框架,最简单的是我开发的df4j


附录

(作者 Marko Topolnik,评论中的讨论摘要)

为每个事件流维护一个队列并使用执行器服务。当出现新事件时,提交将队列排入接收器的任务。不得无条件提交任务,但前提是此类任务尚未运行。为确保这一点,请使用在提交任务时设置并在完成时由任务重置的布尔标志(每个事件流一个)。

于 2012-10-18T09:36:42.763 回答
1

为了确保独立性,我将为每个客户端设置一个单线程池。

您可以包装客户端侦听器以在客户端的线程池上触发相同的事件,以便其他代码可以将其视为简单的侦听器。

于 2012-10-18T08:42:52.703 回答