Asi s krizkem po funuse, ale take jsem neco podobneho nekolikrat resil.
Vzhledem k tomu, ze se v prostredi AS bojim novych threadu a JMS v mnoha
pripadech neni k dispozici (preferuji Tomcat napr. pred JBossem), a tak jiz
delsi dobu pouzivam stale stejny princip zalozeny na servletech (asi neni
originalni, ale me se osvedcil):
1. Klient zasle pozadavek na dlouhe zpracovani -> AS (novy thread / thread z
poolu)
2. Vygeneruje se identifikator pozadavku
3. Zvaliduji se parametry
3.1 Nastal error: Odpoved s chybou klientovi
3.2 Vse OK:
3.2.1. Do Http session se vlozi notifikacni status objekt (na session ma
pristup stary thread vykonavajici business funkcionalitu i thready nove)
3.2.2. Vygeneruje se do response status stranka s odpovedi, ze pozadavek byl
prijat
3.2.3. Zahaji se zpracovani pozadavku ve starem threadu - stary thread zapisuje
stav do notifikacniho status objektu
3.2.4. Status stranka se automaticky refreshuje a pres servlet vypisuje stav z
notifikacniho status objektu (v posledni dobe pouzivam misto refreshe AJAX, coz
je jednodussi a elegantnejsi)
3.2.5. Puvodni thred kona a nastavuje notifikacni status objekt (mozno vyrobit
i bargraf u operaci, kde je mozno prubeh odhadnout). Na konci do notifikacniho
objektu poznamena vysledek
3.2.6. Po ukonceni operace zobrazi status stranka cely vysledek
Vyse zminene reseni ma urcite problemy na serverech s relativne malym poolem
provadecich threadu (WLS), zde je vzdy na zvazeni vyuziti messagingu, ale pozor
na spravne pouziti korelaci zprav tak, aby se vlakna neblokovala. Dale neni
vyse uvedene reseni vhodne pro clustery (dlouhodoby thread neni mozno zmigrovat
a uzivatel prijde o svou praci) - s kvalitnim MOMem toto neni problem.
Jako posledni zminku bych rad upozornil, ze vyvojari casto zapominaji na
synchronizace pri praci s objekty v HttpSession (pri review kodu na to narazim
prekvapive casto).
JM