Dobrý den,

podle mě si na toto úplně vystačíte s JMS serverem, nic navíc nepotřebujete. Podívejte se k čemu jsou určeny JMS destinace typu Topic. To je podle mě přesně to co potřebujete.
Topic je vlastně kanál, odběratelé se mohou dynamicky sami přihlašovat k odběru zpráv z tohoto kanálu.
Navíc mohou odebírat zprávy jen v době kdy jsou aktivně připojeni, nebo využít tzv. "Durable subscription" a poté dostanou i zprávy které byly na Topic odeslány v době kdy nebyly zrovna připojeni.
JMS servery mívají navíc management rozhraní, kde mimo jiné vidíte kdo má na Topic registrované durable subscription atp.

BTW tady se skrývá jedno "provozní nebezpečí" které není na první pohled úplně patrné. Pokud se totiž nějaký klient, který má durable subscription, přestane k JMS serveru připojovat ale nezruší to subscription,
tak vám časem přeplní persistentní úložiště JMS serveru. Samozřejmě toto nebezpečí je hlavně u systémů kde těch zpráv je opravdu hodně nebo jsou velké.

Vlastik

Dne 18.3.2011 11:41, Petr Novak napsal(a):
Zdravím všechny,

zkouším vytvořit komponentu, která by umožňovala dynamicky propojovat různé systémy. Prakticky se mi jedná o realizaci integračního patternu "Dynamic Recipient List".


Principiálně by to mělo fungovat tak, že není dopředu znám seznam příjemců, různé systémy se mohou zaregistrovat prostřednictvím nějakého API k odběru určitých typů zpráv. V rámci registrace jsem chtěl vytvořit dynamicky jejich odběrný kanál (frontu) a ten Dynamic Recipient List Router by podle typu zprávy, která mu přijde na vstupu, poslal kopii do všech registrovaných kanálů, které mají o tento typ zprávy zájem (tedy na základě té registrace).

Chtěl jsem použít řešení založené na Spring Integration + nějaké JMS, asi ActiveMQ.  Ale narážím na tu dynamičnost řešení - jak vytvořit Spring Channel podle nějakého seznamu registrovaných (třeba z databáze). Připadá mi, že Spring má všechno staticky - vše nakonfigurovat a propojit  v XML a pak nastartovat aplikaci. Ano mohl bych zkusit zavádět beany (Channel, Router, ...) do Spring Contextu za chodu, ale to se mi moc nezdá - nevím, jak pak Spring rozdýchá procesy jako injection, postprocesing, AOP a ostatní zpracování koleminicializace bean, které probíhá při jeho startování. Nebo myslíte, že Springu nebude vadit,když mu za chodu aplikace zadefinuji nějaké další beany ? Ani nevím, jestli na to má nějaké API,něco ve smyslu  ApplicationContext.createBean(bean.class,"beanID",properties);

Ještě jsem zvažoval omrknout Apache Camel, nemám s ním zkušenost. Našel jsem, že lze psát pomocí jeho DSL kódy jako

from("jms:xmlOrders").recipientList(header("recipients"));

Ale nejsem si jistý, zda toto lze dělat i za chodu aplikace a nebo to je jen jiný zápis statické XML configurace, která se provede při startu, navytváří se fronty a pospojují se těmi transformatory a routery. To bych pak na tom byl stejně jako s tím Springem.

Co byste použili vy na řešení takové úlohy ? Rád bych se vyhnul objevování kola - tedy že bych si na to musel napsat vlastní integrační framework.  Zároveň si myslím, že jde v principu o relativně jednoduchou úlohu a tak řešení typu použít ESB mi připadne jako kanón na vrabce.

Google mi zatím moc nepomohl, nebo jen nevím, jak se ho správně zeptat :o).
V této oblasti nemám moc zkušeností, začínám se s tím seznamovat, tak budu rád za každý váš tip, radu nebo zkušenost.

Přeji úspěšný den

Petr



-- 
Vlastimil Elias
Senior Software Engineer
JBoss.org community team

Odpovedet emailem