1

我害怕使用事件总线http://code.google.com/p/guava-libraries/wiki/EventBusExplained,因为我认为它在内部使用了无界队列。如果有很多消息发布到它。它可能会遇到完整的 gc。

是否存在类似的实现,它做同样的事情是无界队列?

4

2 回答 2

3

事实上,Guava 使用了一个ConcurrentLinkedQueue,它是无界的:

基于链接节点的无界线程安全队列。

请参阅EventBus.java 的第 151-158 行

/** queues of events for the current thread to dispatch */
private final ThreadLocal<ConcurrentLinkedQueue<EventWithHandler>>
    eventsToDispatch =
    new ThreadLocal<ConcurrentLinkedQueue<EventWithHandler>>() {
  @Override protected ConcurrentLinkedQueue<EventWithHandler> initialValue() {
    return new ConcurrentLinkedQueue<EventWithHandler>();
  }
};

您可以随时修改代码以使用例如ArrayBlockingQueue. 您是否研究过其他类似的解决方案,例如中断器?

于 2012-09-11T03:10:05.107 回答
1

我同意 Arjit 的观点,即在某些情况下,无界队列可能被认为是不利的。例如,如果我有一个服务正在运行,它使用来自各种来源的消息来处理它们,而我不知道传入消息的速率。它可能会超过我的工人/消费者的处理速度,我可能想建立以下合同:如果仍有许多消息未决,向工人发布新消息将失败或阻塞。这不仅可以防止内存不足,还可以保证消息在特定时间范围内得到实际处理。此外,如果服务在其限制范围内运行,客户将收到直接反馈。

@Arjit:您可以在https://github.com/bennidi/mbassador上查看 MBassador

它与 Google Guava 事件总线非常相似,但提供了更多功能 - 有界消息队列就是其中之一。它也非常快,其内部设计允许大量定制和扩展。据了解,我能够在短时间内解决其他用户的大部分功能请求。也许你试一试。

于 2013-03-04T14:48:22.080 回答