Библиотека облегченных сообщений

Я начну небольшой Java-проект (действительно GWT) в ближайшем будущем, и я нахожусь на этапе "сбора информации".

Q: Существует ли облегченная библиотека Message Bus, написанная на Java?

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

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

Обновление: похоже, что GWT теперь поддерживает встроенную "шину событий".

5 ответов

Решение

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

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

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

На самом деле у меня есть собственный простой контейнер сообщений RabbitMQ, который автоматически создает привязки очередей, а полученные сообщения отправляет в Guava EventBus. Это невероятно элегантно и великолепно масштабируется.

Вы можете легко использовать свою платформу DI для регистрации подписчиков. Для Spring я создаю BeanPostProcessor, который будет автоматически регистрировать бины с @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.

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

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

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

Может быть, вы могли бы попробовать какое-нибудь решение на основе jabber (XMPP). А как насчет openfire?

Другие вопросы по тегам