2009-12-23 2 views
17

В ближайшем будущем я начну небольшой проект Java (GWT), и я нахожусь на этапе «сбора информации».Библиотека сообщений Lightweight Message Bus

В: Существует ли библиотека сообщений с легкими сообщениями, написанная на Java?

Мои требования легкий тоже :-)

  1. асинхронном (нет необходимости в синхронизации)
  2. многоадресного и точка-точка
  3. нет строгого сообщение заказа
  4. сообщение "конверт" в идеале «принадлежит» по шине сообщений (т.е. с точки зрения управления жизненным циклом)
  5. локализованная доставка (то есть не межпроцессная или межузловая)

Обновление: Кажется, что GWT теперь поддерживает интегрированный "event bus".

+0

Вы можете посмотреть здесь https://github.com/javaplugs/minibus, это чрезвычайно легкий и простой автобус событий. – rumatoest

ответ

10

Посмотрите на eventbus.

(Ссылка исправлена, спасибо jldupont, чтобы указать это).

+1

Вы также можете проверить https://github.com/bennidi/mbassador.Он очень легкий, быстрый и использует слабые ссылки. – bennidi

+0

@bennidi: Вы должны опубликовать это как новый ответ вместо комментария –

0

Не уверен, что это действительно легкий вес. Но это не соответствует остальной части вашего описания: ActiveMQ

+0

@reinier: Я знаю о решениях на основе AMQP: (1) нелегкий (конечно, относительный ;-) (2), действительно не применимый для Проект на основе GWT. – jldupont

+0

@jldupont: ah right ... все это нужно запустить в том же процессе в браузере? Да, в этом случае игнорируйте эту идею; ^) – Toad

+0

@reinier: затем удалите ее, поскольку в какой-то момент вы, скорее всего, получите несколько голосов (а не от меня). – jldupont

0

Возможно, вы можете попробовать решение на основе jabber (XMPP). Как насчет openfire?

+0

@marcospereira: Вы серьезно? это не потому, что я не проголосую (часто), что здесь можно злоупотреблять! – jldupont

+0

jldupont: да, я серьезно. И я не понимаю, почему вы считаете мой комментарий злоупотреблением. Если вы считаете, что это неправильное решение, добавьте некоторые аргументы в таблицу. ;-) – marcospereira

+0

на самом деле xmpp довольно круто, но, возможно, у него слишком много накладных расходов – Leo

4

Если вы используете Spring уже, то удобной функцией скрытой функции Spring является интерфейс ApplicationEventMulticaster, который представляет собой очень простой API для публикации и подписки на события, созданные приложением. В реализациях используется каркас TaskExecutor, что означает, что они могут синхронизироваться или асинхронно по желанию. Кроме того, каждый имеет метод publishEvent, поэтому его легко настроить для классов, управляемых Spring.

Так что да, если вы уже используете Spring, вам не нужно использовать еще одну утилиту для этого, она уже встроена.

+2

+1: большое спасибо. Я не буду использовать Spring, но я всегда ценю хорошую информацию. – jldupont

9

Я знаю, что это старый вопрос, но я думаю, что более современное решение заключается в использовании Guava's Event Bus (предоставлен Я не уверен, если он будет работать на GWT, но и ваш заголовок и теги не говорят GWT).

У меня есть обычай RabbitMQ simple message container, который автоматически создаст привязки очередей и полученные сообщения отправит в Guava EventBus. Его невероятная элегантность и весы великолепно.

Вы можете легко использовать свою инфраструктуру DI для регистрации подписчиков. Для Spring я создаю BeanPostProcessor, который автоматически регистрирует bean-компоненты с @Subscribe.

Ниже 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.

+0

Я попытался использовать гуавскую гуавскую шину событий и застрял, потому что он использует сильные ссылки на слушателей. Я хотел использовать его в весенней среде и просто вставлять в него все бобы с использованием постпроцессора. Это не будет работать с guava. Я создал свое собственное решение, которое размещено на github https://github.com/bennidi/mbassador. Сейчас он довольно стабилен (используется в производстве уже полгода) и быстрее, чем автобус google. Он также предлагает больше возможностей, но так же прост в использовании. – bennidi

+0

Я сделал свою собственную реализацию аналогично, но главным образом потому, что Гуава использует JULI, и мне не понравилось, что он ловил исключение. Я должен проверить ваше ... Я также заметил, что Гуава использует коллекцию класса , которая может потенциально привести к утечкам переходов. –

+1

Что вы подразумеваете под коллекцией класса , может привести к утечке проницаемости? Кроме того, я был бы очень рад Обратная связь по MBassador. Если в нем отсутствует функция, которую вы потребуете, вы можете указать проблему в github. – bennidi