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".
![](pngRhO0l4MCMN.png)
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
|