Библиотека облегченных сообщений
Я начну небольшой Java-проект (действительно GWT) в ближайшем будущем, и я нахожусь на этапе "сбора информации".
Q: Существует ли облегченная библиотека Message Bus, написанная на Java?
Мои требования тоже легкие:-)
- асинхронный (не требуется синхронизация)
- многоадресная и двухточечная
- нет строгого порядка сообщений
- сообщение "конверт" в идеале "принадлежит" шине сообщений (т. е. с точки зрения управления жизненным циклом)
- локализованная доставка (то есть не межпроцессная и не межузловая)
Обновление: похоже, что GWT теперь поддерживает встроенную "шину событий".
5 ответов
Я знаю, что это старый вопрос, но я думаю, что более современное решение состоит в том, чтобы использовать шину событий 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?