Dnes budu pokračovat v popisu svých experimentů s Terracottou. Povíme si něco o distribuovaném volání metod (Distributed Method Invocation). Motivace je jednoduchá. Představme si, že uživatel změní přes webové rozhraní globální nastavení aplikace. O této události potřebujeme informovat všechny členy clusteru. V EJB ale i bez nich je řešení velmi obtížné. Jediné mě známé řešení je šíření této události pomocí sdílené databáze. (a samozřejmě JMS viz. diskuze (updated 6.12))
Jak nám v tom pomůže Terracotta? Hodně. Umožňuje označit metodu jako distribuovanou. Tzn. pokud mám instanci objektu s takovouto metodou dostupnou z rootu a na jednom z členů clusteru tuto metodu zavolám, zavolá se mi i na ostatních členech. Ukažme si to na příkladu. Mějme následující triviální listener.
|
Označíme metodu actionPerformed
jako distribuovanou (viz. XML updated 28.11.2007) a nasimulujeme si její volání. Nejdříve musíme umístit instanci listeneru do rootu. Použijeme na to skladiště, které máme z minula. Pak už jenom zavoláme metodu listeneru.
|
Pokud vysílač běží na jediném virtuálním stroji spuštěném v clusteru, nic zvláštního se nestane. Jenom se nám vypíše hláška na konzoli. Zajímavé to začne být, až když spustíme další instanci. Přijímající stranu nejjednodušeji nasimulujeme takto.
|
To je nejjednodušší příklad který mě napadl. Pokud tento přijímač běží v okamžiku kdy spustím vysílač, vypíše se mi v konzoli přijímače WorkerThread(dmi_stage,0) says "Action!"
. Cože, kde se mi tam vzalo další vlákno, vždyť ta moje aplikace je evidentně jednovláknová? Není! V okamžiku kdy jakoukoliv aplikaci spustím v Terracottě, musím počítat s tím, že je vícevláknová a chovat se podle toho. Zopakujme si, co znamená distribuované volání metod. Zavolám-li metodu, která je označena jako distribuovaná, na jednom členu clusteru, zavolá se mi i na ostatních. V uvedeném případě mám dva virtuální stroje spojené do clusteru, metoda se mi zavolá na obou. Na jednom normálně, na druhém automagicky
Samozřejmě, uvedený příklad je umělý. V praxi by nám pravděpodobně na všech virtuálních strojích běžela stejná aplikace. Pak by to bylo o něco méně magické. Také bychom listener pravděpodobně instancovali pomocí Springu, na což je Terracotta také připravena.
Co říci závěrem. Terracotta je zajímavý nástroj, který nám umožňuje dělat věci, které by bez ní byly obtížné. Navíc podobné experimentování je neuvěřitelně snadné. Stačí si stáhnout Eclipse plugin a pak všechno jednoduše naklikáte. Zkuste si to.
Zdrojové kódy jsou na stejném místě jako minule.
“Jediné mě známé řešení je šíření této události pomocí sdílené databáze.”
A JMS Topic znas urcite take ;-).
Mam to chapat tak, ze pokud je jajykoliv objekt ulozeny do objektu distribuovaneho Terracotou, dochazi nejen k propagaci stavu, ale i chovani? Pripadne lze toto chovani ridit na mensi granularite, napriklad anotaci metody?
Nějak jsem z článku nepostřehl jak “označíme metodu actionPerformed jako distribuovanou”? Nebo to je dáno tím, že umístíme objekt do rootu?
Metodu actionPerformed označíme jako distribuovanou v XML konfiguraci Terracotty. Například takto: https://java-crumbs.svn.sourceforge.net/svnroot/java-crumbs/terracotta-playground/tc-config.xml Tzn. budou distribuovány jenom označené metody.
S tím JMS topicem to není tak jednoduché. Vezměme si třeba MDB. Těch mám v poolu na jednom JVM více. Očekávám, že pokud poslouchají na topicu, tak zprávu zpracuje právě jedna instance (rozhodně ne všechny v poolu, to by to bylo k ničemu). Jak se to bude chovat v clusteru? Zpráva se zpracuje N krát, kde je N počet členů clusteru? Nebo jednou? Specifikace taktně mlčí.
Kdyz pouzijete JSM topics muzete tech prijemcu zpravy mit vice, viz napr.: http://java.sun.com/developer/EJTechTips/2003/tt0415.html
I v pripade MDB to lze samozrejme nastavit, aby to dostali vsichni. Neni to sice pokryte speckou, ale aplikacn iservery to podporuji. Kdyby to byl problem, tak to lze udelat pres klasicke JMS API.
Máte pravdu JMS topic pravděpodobně použí lze. Sypu si popel na hlavu i když už na ní mám máslo.
Hi. I work on Terracotta but, unfortunately, I don’t speak czech. I’d love to know what you think of Terracotta so far and what you’re using it for…
Cheers,
Orion