Tu synchronizaci tam, kde potřebuji dělám tak, že mám informaci o nějakém systémovém úkolu, jehož identifikátor posílám v message, a ve chvíli, kdy se úkol dokončí, tak se k němu zapíše výsledek.
Jirka 2012/4/13 Ondra Medek <xmed...@gmail.com> > No já myslím, že Petr bude ještě potřebovat nějakou synchronizaci až > se data načtou. > > V Tvém případě v JEE prostředí můžeš použít vlákna, protože tvoje > metoda je vlastně synchronní, jen jistá část kódu se kvůli výkonu volá > asynchronně. Akorát v těch vláknech nemůžeš používat JEE věci, jako je > např. přístup k DB. Ale i tak by bylo pravděpodobně lepší použít > některý z navrhovných způsobů. > > 2012/4/13 Jiří Chaloupka <k...@chalu.cz>: > > V J2EE se namísto toho využije aplikační server a pomocí message se pošle > > pokyn k vykonání nějaké asynchronní operace. > > Podívejte se třeba na > > > http://www.java2s.com/Code/Java/EJB3/EJBTutorialfromJBossdemoformessagedrivenbean.htm > > Protože jste toto asi ještě nepoužil, ještě napovím, že zpráva může být > > různých typů včetně java.lang.Object > > > > Jirka Chaloupka > > > > Dne 13. dubna 2012 14:33 Petr Franta <petr.fra...@gmail.com> napsal(a): > > > >> Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech > J2EE > >> aplikací? > >> Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že > >> jsou doporučené metody jak to bezpečně dělat (pomocí různých > implementací > >> timerů atd.). > >> > >> Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech > >> různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé > čekat na > >> doběh jednotlivých dotazů, které jsou na sobě nezávislé. > >> Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist > jestli > >> tam není nějaká záludnost: > >> > >> /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k > >> načtení dat) */ > >> public class DbWorker implements Callable<Result> { > >> ... > >> } > >> > >> /** voláno z requestu */ > >> ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS); > >> List<Future<Result>> res = new ArrayList<Future<Integer>>(); > >> > >> for (DbTask task : tasks) { > >> // načtení dat > >> res.add(executor.submit(new DbWorker(task, ...))); > >> } > >> > >> // čekej na dokončení vláken > >> > >> // Zpracování načtených dat > >> for (Future<Integer> future : res) { > >> System.out.println(future.get()); > >> } > >> > >> Petr > > > > > > > > -- > Ondra Medek >