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 <[email protected]>:
> 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 <[email protected]> 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

Odpovedet emailem