事件总线Guava有一个无限的队列

时间:2012-09-11 02:58:26

标签: java events garbage-collection guava

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

是否存在类似的实现,它执行与无界队列相同的操作?

2 个答案:

答案 0 :(得分:3)

事实上,Guava使用ConcurrentLinkedQueue,这是无限的:

  

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

请参阅line 151-158 of EventBus.java

/** 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。您是否研究过其他相似的解决方案,例如disruptor

答案 1 :(得分:1)

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

@Arjit:您可以在https://github.com/bennidi/mbassador

上查看MBassador

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