Ahojte,
5 minut na HTTP poziadavku je nic. Predstavte si stahovanie 1GB suboru
cez HTTP, tiez to bezne trva viac ako 5 minut. Finta totiz nie je v
dlzke poziadavky, ale v dlzke neposielania dat. Takze staci, aby server
generoval nejake data.
Uspesne pouzivame pri importe / exporte dlhych dat nasledovny postup:
Server ma vyexportovat Excel s nejakym zlozitym reportom.
1. Klient posle poziadavku, tu spracovava servlet.
2. Servlet prve co spravi je to, ze vygeneruje response, cize zasle kus
HTML kodu (hlavicka, styly... odporucam ten HTML kod dat do JSP a v
servlete spravit pageContext.include(), da sa to potom lahsie modifikovat)
3. Pocas generovania musi na klienta nieco posielat
4. Po vygenerovani do vystupu posle HTML kod s linkou na subor a ukonci
response
V bode 3 kedze sa musi nieco generovat, tak mame napisanu komponentu v
JavaScripte, ktora aktualizuje progress bar (podmienkou je, ze musime
vediet odhadnu, kolko % uz mame hotove). Takze v bode 3 posielame na
klienta nieco ako:
... kopa prazdnych medzier, aby IE necachoval (aj ked sa pouzije
out.flush, nepomoze) tak aspon 500 znakov ...
<script...>updateProgressBar(30);</script>
... kopa prazdnych medzier...
Pre klienta je to super, netreba na serveri riesit MQ (aj ked vyhoda MQ
je v seriovom spracovani, takyto nas postup by mohol sposobit DOS, ak by
to spravilo vela pouzivatelov naraz) a naviac klient vidi kolko % uz ma
hotovych (do progress baru sa da dorobit aj straveny cas, aj odhadovany
cas do konca).
Taketo riesenie pouzivame casto s dobrymi vysledkami a zatial nebol
problem v tom, ze by prehliadac zatvoril spojenie a teda pouzivatel by
nevidel koniec procesu. Naviac to vyzera dost efektne a okno sa
nerefreshuje, takze je to kontinualny proces.
Burdik Petr wrote:
Ahojas,
mam problemek. Mam operaci, ktera trva zhruba 5 minut. To je na delku
jednoho pozadavku pres http velmi dlouho. Napada Vas nejake reseni,
jak pockat na takto dlouhou operaci?
To je trosku zmatene, tak priklad:
1. pres webformular zadam hodnoty
2. poslu na server
3. pozadavek trva na vyrizeni 5 minut. Do te doby mi samozrejme vyprsi
spojeni. Operace dobehne, ale formular se nikdy nezobrazi.
Mnou namyslene reseni:
1. vytvorit zakladni objekt, ulozit ho a dat mu stav ze neni dodelany
2. asynchronne (casovacem?) spustit danou dlouhotrvajici operaci
3. zobrazit formular ze byl objekt vytvoren a bude tam stav.
Otazkou je jestli a jak spustit danou operaci asynchronne v servletu
tak, abych mohl pokracovat v praci dal.
Pet
--
jeeff