Обмен сообщениями внутри одного приложения
От: vb-develop  
Дата: 13.02.08 11:07
Оценка:
Добрый день!
Возникла задача обмена сообщениями внутри одного приложения. Требуется уведомлять о различных событиях, подписанных на них слушателей. Сейчас слушатели находятся внутри приложения, но в дальнейшем может появится необходимость уведомлять внешних слушателей о событиях, поэтому привязываться к API приложения не хочется. Интересует на какие паттерны можно посмотреть для решения такой задачи, и с помощью чего они реализуются на Java.
Спасибо.
Re: Обмен сообщениями внутри одного приложения
От: C0s Россия  
Дата: 13.02.08 11:10
Оценка: 2 (1)
Здравствуйте, vb-develop, Вы писали:

VD>Возникла задача обмена сообщениями внутри одного приложения. Требуется уведомлять о различных событиях, подписанных на них слушателей. Сейчас слушатели находятся внутри приложения, но в дальнейшем может появится необходимость уведомлять внешних слушателей о событиях, поэтому привязываться к API приложения не хочется.


трудно предложить что-то более стандартное и удобное, чем jms. бесплатных реализаций тоже хватит для выбора. но это в любом случае подразумевает отдельный процесс сервера, так что, не исключаю, что имеет смысл, попристальнее подумать о том, какие внешние слушатели появятся, и как их надо будет уведомлять. а то, может, их можно будет по snmp уведомлять и не сложнее.
Re[2]: Обмен сообщениями внутри одного приложения
От: vb-develop  
Дата: 13.02.08 12:38
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>трудно предложить что-то более стандартное и удобное, чем jms. бесплатных реализаций тоже хватит для выбора. но это в любом случае подразумевает отдельный процесс сервера, так что, не исключаю, что имеет смысл, попристальнее подумать о том, какие внешние слушатели появятся, и как их надо будет уведомлять. а то, может, их можно будет по snmp уведомлять и не сложнее.


Спасибо. А что лучше использовать для преобразования объектов в формат сообщений JMS и обратно?
Re[3]: Обмен сообщениями внутри одного приложения
От: C0s Россия  
Дата: 13.02.08 12:40
Оценка:
Здравствуйте, vb-develop, Вы писали:

VD>Спасибо. А что лучше использовать для преобразования объектов в формат сообщений JMS и обратно?


стандартные интерфейсы jms, которые предоставляет согласно спеке JMS любой поставщик реализации
скорее всего, если объекты — обычные serializable, будет удобно использовать ObjectMessage (читай спеку по типам сообщений в JMS)
Re[2]: Обмен сообщениями внутри одного приложения
От: denis.zhdanov Россия http://denis-zhdanov.blogspot.com/
Дата: 13.02.08 13:21
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>... но это в любом случае подразумевает отдельный процесс сервера...


Не обязательно. Ручками не трогал, но можно посмотреть на SomnifugiJMS, которая позиционируется как 'an implementation of JMS that works inside a single JVM to send JMS Messages between Threads'
http://denis-zhdanov.blogspot.com
Re[2]: Обмен сообщениями внутри одного приложения
От: Аноним  
Дата: 13.02.08 19:14
Оценка: +1
Здравствуйте, vb-develop, Вы писали:

VD>>Возникла задача обмена сообщениями внутри одного приложения. Требуется уведомлять о различных событиях, подписанных на них слушателей. Сейчас слушатели находятся внутри приложения, но в дальнейшем может появится необходимость уведомлять внешних слушателей о событиях, поэтому привязываться к API приложения не хочется.


C0s>трудно предложить что-то более стандартное и удобное, чем jms.


А зачем вообще здесь JMS? Он же вобще не для этого сделан был
Используйте http://en.wikipedia.org/wiki/Observer_pattern И будет все просто и сердито и сообщения будете клепать как вам нравится Хотя если честно то нужно больше информации для каких целей вам это нужно и что вы подразумеваете под словом "сообщение". Если вам нужно мессаги слать куда-то то COS дело говорит кроме без JMS будет тяжело, а если просто событийная обработка чего-либо в приложении то JMS тут скорее ваш враг чем друг
Re[3]: Обмен сообщениями внутри одного приложения
От: vb-develop  
Дата: 14.02.08 07:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А зачем вообще здесь JMS? Он же вобще не для этого сделан был

А>Используйте http://en.wikipedia.org/wiki/Observer_pattern И будет все просто и сердито и сообщения будете клепать как вам нравится Хотя если честно то нужно больше информации для каких целей вам это нужно и что вы подразумеваете под словом "сообщение". Если вам нужно мессаги слать куда-то то COS дело говорит кроме без JMS будет тяжело, а если просто событийная обработка чего-либо в приложении то JMS тут скорее ваш враг чем друг

Как с внешними приложениями взаимодействовать в паттерне Observer? Совсем не хочется свой трехколесный велосипед изобретать.
Re[4]: Обмен сообщениями внутри одного приложения
От: Аноним  
Дата: 14.02.08 08:17
Оценка: 1 (1)
Здравствуйте, vb-develop, Вы писали:

VD>Как с внешними приложениями взаимодействовать в паттерне Observer? Совсем не хочется свой трехколесный велосипед изобретать.


А вот здесь как раз можно использовать JMS. А также SNMP, HTTP, plain sockets и вообще все, что захочется. Просто такой передатчик будет всего лишь одним из возможных конкретных обсерверов (одной из реализаций).
Фактически, у вае есть две различных задачи.
Первая — уведомление занитересованных объектов о каких-либо событиях или изменениях (отправка сообщения от объекта, генерирующего эти события). Это как раз решается с помощью шаблона Observer. Причем желательно — в его простейшем виде — на интерфейсе Observer или Listener. Это прекрасно позволяет при необходимости добавить новые протоколы/способы оповещения. Так, например протокол SNMP в случае интерфейсов добавляется достаточно просто (реализовать интерфейс и подписать его на события), а в случае жестко прописанного уведомления через JMS в коде Observable — только путем большой переработки кода или адаптеров над JMS. Ну и для взаимодействия с локальными объектами нет прослойки в виде JMS.
Вторая задача — доставка этого уведомления до того места, где оно может быть использовано (локальный пользователь/удаленный и т.п.). Это уже дело конкретной реализации Observer'а, реализующего конкретный способ доставки (протокол обмена). Т.е. во время выполнения без проблем может быть 3 локальных обсервера, 2 обсервера на JMS и один на SNMP (например, для сборки статистики).
Re: Обмен сообщениями внутри одного приложения
От: Stormblast http://www.myspace.com/stormblastblack
Дата: 14.02.08 10:09
Оценка:
Здравствуйте, vb-develop, Вы писали:

Внешний слушатель это будет сервер приложений ?
Re[2]: Обмен сообщениями внутри одного приложения
От: vb-develop  
Дата: 14.02.08 10:22
Оценка:
Здравствуйте, Stormblast, Вы писали:

S>Здравствуйте, vb-develop, Вы писали:


S>Внешний слушатель это будет сервер приложений ?


Нет, не сервер приложений. Просто другие приложения на этой же машине, либо в локальной сети.
Re[4]: Обмен сообщениями внутри одного приложения
От: Аноним  
Дата: 14.02.08 12:04
Оценка:
Здравствуйте, vb-develop, Вы писали:
VD>Как с внешними приложениями взаимодействовать в паттерне Observer? Совсем не хочется свой трехколесный велосипед изобретать.

RPC
Re[5]: Обмен сообщениями внутри одного приложения
От: C0s Россия  
Дата: 14.02.08 12:27
Оценка:
Здравствуйте, Аноним, Вы писали:

VD>>Как с внешними приложениями взаимодействовать в паттерне Observer? Совсем не хочется свой трехколесный велосипед изобретать.


А>RPC


объяснили бы ещё заодно топикстартеру, чем синхронные комуникации могут быть плохи для распределенных нотификаций. а то предлагать "простые на первый взгляд" решения легче лёгкого...
Re[6]: Взаимодействие между приложениями
От: vb-develop  
Дата: 14.02.08 14:43
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, Аноним, Вы писали:


А>>RPC


C0s>объяснили бы ещё заодно топикстартеру, чем синхронные комуникации могут быть плохи для распределенных нотификаций. а то предлагать "простые на первый взгляд" решения легче лёгкого...


По-моему если отправку событий observer'у сделать асинхронной, дальше уже можно в нем через RPC рассылать уведомления. Но все равно каким-то велосипедом попахивает.

У меня еще такой вопрос. Если возникло событие А, о котором приложение Б должно получить уведомление, но в момент возникновения события А приложение Б было остановлено (просто не работало или проблемы с сетью, да мало ли), но при этом нужно чтобы событие А обязательно дошло до приложения Б в момент его включения, как такое реализовать лучше?
Re[7]: Взаимодействие между приложениями
От: C0s Россия  
Дата: 14.02.08 14:46
Оценка:
Здравствуйте, vb-develop, Вы писали:

VD>По-моему если отправку событий observer'у сделать асинхронной, дальше уже можно в нем через RPC рассылать уведомления. Но все равно каким-то велосипедом попахивает.


сам же и задаёшь правильный вопрос, в котором уже половина ответа:

VD>У меня еще такой вопрос. Если возникло событие А, о котором приложение Б должно получить уведомление, но в момент возникновения события А приложение Б было остановлено (просто не работало или проблемы с сетью, да мало ли), но при этом нужно чтобы событие А обязательно дошло до приложения Б в момент его включения, как такое реализовать лучше?


именно об этом и была речь (в смысле минусов RPC как синхронного механизма соединения). а ответ я уже дал выше — JMS (предполагаются durable subscriptions и/или persistent queues)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.