Облегченная структура публикации/подписки в java
Есть ли хорошая облегченная структура для java, которая предоставляет шаблон публикации/подписки?
Некоторые идеальные функции
- Поддержка дженериков
- Регистрация нескольких подписчиков издателю
- API в первую очередь интерфейсы и некоторые полезные реализации
- чисто в памяти, настойчивость и гарантии транзакций не требуются.
Я знаю о JMS, но это слишком сложно для моей потребности. Опубликованные/подписанные данные являются результатом сканирования файловой системы, при этом результаты сканирования подаются на другой компонент для обработки, которые затем обрабатываются перед подачей на другой и так далее.
EDIT:
Все в рамках одного процесса. Свойство PropertyChangeListener из beans не совсем сокращает его, поскольку оно сообщает об изменениях свойств, а не публикует определенные элементы. Я мог бы обучать ProprtyChangeListener работать, имея свойство "последний опубликованный объект" и так опубликованные объекты. PropertyChangeListeners не поддерживают дженерики и укоренены в семантике изменения свойств, а не в чистой публикации/подписке. Шаблон Observer/Observable java.util был бы хорош, но Oberver - это конкретный класс.
Ответы
Ответ 1
JMS такой же легкий или тяжелый, как вы его настраиваете. Мы используем, например, HornetQ в одном проекте с очередью в памяти. Он прост в настройке, не требует какой-либо JNDI-конфигурации и действительно прост в использовании.
Я считаю, что JMS как API для Message Pub/Sub так же просто, как и получается. (И не проще;)
Ответ 2
Кажется, это соответствует требованиям:
EventBus из Google Guava Library - "Публикация-стиль подписки между компонентами, не требуя, чтобы компоненты явно регистрировались друг с другом", Он также может быть AsyncEventBus, который будет отправлять события в другой поток.
Некоторые дополнительные опции для рассмотрения:
-
Если в этом процессе возможно использование шаблона Observer. Подписчики могут добавлять слушателей и получать уведомления о событиях. Observable уже является частью Java API.
-
FFMQ - полная реализация Java, облегченная реализация Fast JMS 1.1 Queue.
Ответ 3
Поскольку вы используете Spring, я не знаю, знаете ли вы, что Spring имеет свою собственную облегченную среду событий. Он используется в основном внутри самой структуры, но отлично подходит для кода приложения.
По умолчанию это синхронный pub/sub, но вы можете сделать его асинхронным с помощью ApplicationEventMulticaster
.
Ответ 4
Я думаю, что Camel также является хорошим кандидатом. Особенно с публикацией-подписью шаблона
Верблюд может быть встроенным и легким. Он предлагает шаблоны интеграции предприятия - множество полезных инструментов для интеграции, внутри приложения или даже с другими участниками (следовательно, "интеграция" ).
Он сравнивается с Spring Интеграция, но более полная ИМО.
Ответ 5
Если вы пересекаете границы процесса, тогда возникает некоторая степень "веса". Почему вы говорите, что JMS - тяжеловес? API довольно прост? Есть, предположительно, легкие реализации, например текст ссылки Более тяжелые затраты, такие как постоянство и транзакционная способность, являются необязательными.
Что вам нужно, это легче, чем это?
Ответ 6
Боб Ли имеет класс QueueFile
в http://snipt.org/GWm/, который может показаться вам интересным. Это простая постоянная очередь и может использоваться несколькими потребителями. Похоже, вам не нужна настойчивость, но поскольку все это так легко, все равно может быть полезно.