【问题标题】:Lightweight Message Bus library [closed]轻量级消息总线库 [关闭]
【发布时间】:2010-12-29 12:44:06
【问题描述】:

我将在不久的将来开始一个小型 Java(真的是 GWT)项目,我正处于“信息收集”阶段。

问:有没有用 Java 编写的轻量级消息总线库?

我的要求也是轻量级的 :-)

  1. 异步(无需同步)
  2. 多播和点对点
  3. 没有严格的消息排序
  4. 消息“信封”理想情况下由消息总线“拥有”(即在生命周期管理方面)
  5. 本地化交付(即不是进程间也不是节点间)

更新:GWT现在似乎支持集成"event bus"

【问题讨论】:

标签: java messaging


【解决方案1】:

看看eventbus

(链接已修复;感谢jldupont 指出这一点)。

【讨论】:

  • 您也可以结帐github.com/bennidi/mbassador。它非常轻量、快速并且使用弱引用。
  • @bennidi:您应该将其作为新答案发布,而不是使用评论
【解决方案2】:

我知道这是一个老问题,但我认为更现代的解决方案是使用 Guava's Event Bus (当然我不确定它是否适用于 GWT,但您的标题和标签都没有不要说 GWT)。

我实际上有一个自定义的RabbitMQ simple message container,它会自动创建队列绑定,然后收到的消息将分派到 Guava EventBus。它令人难以置信的优雅,并且可扩展性极佳。

您可以轻松地使用您的 DI 框架来注册订阅者。对于 Spring,我创建了 BeanPostProcessor,它将自动向 @Subscribe 注册 bean。

下面是 Spring BeanPostProcessor:

package com.snaphop.spring;

import java.lang.reflect.Method;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

@Component
public class EventBusBeanPostProcessor implements BeanPostProcessor {

    private EventBus eventBus;

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (isApplicable(bean)) {
            eventBus.register(bean);
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    protected boolean isApplicable(Object bean) {
        for(Method m : bean.getClass().getMethods()) {
            if (m.isAnnotationPresent(Subscribe.class))
                return true;
        }
        return false;
    }

    @Autowired
    public void setEventBus(EventBus eventBus) {
        this.eventBus = eventBus;
    }

}

我确信在 Guice 中做类似的事情是微不足道的。

【讨论】:

  • 我曾尝试使用 google guava 事件总线并卡住了,因为它使用了对侦听器的强引用。我想在 spring 环境中使用它,并使用后处理器将所有 bean 塞入其中。这不适用于番石榴。我创建了自己的解决方案,托管在 github github.com/bennidi/mbassador 上。现在已经相当稳定了(在生产中使用了半年),比google bus还快。它还提供更多功能,但同样易于使用。
  • 我也做了自己的实现,但主要是因为 Guava 使用 JULI,我不喜欢它捕获异常。我得看看你的……我还注意到 Guava 使用了一个 Class> 的集合,这可能会导致 permgen 泄漏。
  • Class> 的集合是什么意思可能导致 permgen 泄漏?此外,我非常感谢您对 MBassador 的反馈。如果它缺少您需要的功能,您可以在 github 上提出问题。
  • 实际上,使用 Guava EventBus 不需要显式检查 @Subscribe Annotations:github.com/google/guava/wiki/…
【解决方案3】:

如果您碰巧已经在使用 Spring,那么 Spring 的一个方便的隐藏功能是 ApplicationEventMulticaster 接口,这是一个非常简单的 API,用于发布和订阅应用程序生成的事件。这些实现使用TaskExecutor 框架,这意味着它们可以根据需要同步或异步。此外,每个 ApplicationContext 都有一个 publishEvent 方法,因此为 Spring 管理的类设置它非常容易。

所以是的,如果您已经使用 Spring,则无需其他实用程序来执行此操作,它已经内置了。

【讨论】:

  • +1:非常感谢。我不会使用 Spring,但我总是重视好的信息。
【解决方案4】:

不确定它是否真的很轻。但它确实符合您的其余描述:ActiveMQ

【讨论】:

  • @reinier:我知道基于 AMQP 的解决方案:(1) 不是轻量级的(当然是相对的 ;-) (2) 并不真正适用于基于 GWT 的项目。
  • @jldupont: 啊对...这一切都必须在浏览器的同一个进程中运行,对吧?是的,在这种情况下忽略这个想法;^)
  • @reinier:然后删除它,因为您可能会在某个时候(不是来自我)得到一些反对票。
  • @jldupont:他们倾向于这样做。 ;^) 我的错误解决方案仍然会增加其他可能提出相同响应的人的对话
  • @reinier:那就随心所欲吧。干杯:-)
【解决方案5】:

也许您可以尝试一些基于 jabber (XMPP) 的解决方案。开火呢?

【讨论】:

  • @marcospereira:你是认真的吗?这不是因为我不(经常)拒绝投票,人们可以在这里滥用!
  • jldupont:是的,我是认真的。我不明白为什么你认为我的评论是一种滥用。如果您认为这是一个错误的解决方案,请将一些论据摆在桌面上。 ;-)
  • 其实 xmpp 很酷,但可能开销太大
猜你喜欢
  • 2010-10-17
  • 2015-03-20
  • 2012-08-02
  • 2011-07-21
  • 2011-10-25
  • 1970-01-01
  • 2012-12-11
  • 2016-11-01
  • 2012-01-25
相关资源
最近更新 更多