Подтвердить что ты не робот

Легкая библиотека сообщений сообщений

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

Q: Есть ли в Java библиотека сообщений с легким доступом?

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

  • async (нет необходимости в синхронизации)
  • многоадресная рассылка и точка-точка
  • отсутствие строгого упорядочения сообщений
  • сообщение "конверт" идеально "принадлежит" по шине сообщений (т.е. с точки зрения управления жизненным циклом).
  • локальная доставка (т.е. не межпроцессный, а также интер- node)

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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