Diky za odpoved.

Tohle je presne to co jsem potreboval.
Funguje to presne tak jak ma.


Lukas Adamek

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED]
Sent: Thursday, November 15, 2007 6:25 PM
To: [email protected]
Subject: Re: EJB3 a transakce v transakci

Dobry den,

v principu je tento navrh dobre, jen je potreba volat metodu  
ulozReporty() pres EJB objekt, protoze v EJB objektu container  
zahajuje transakce. Tj. misto ulozReporty() napr.:

sessionContext.getBusinessObject(MyLocalIntf.class).ulozReporty(reportsList);

Transakcni atributy se pri primem volani (tj. v ramci beany) neuplatni.

Jo a nepujde o vnorene transakce, ale aktivni transakce bude  
pozastavena a vytvori se nova (flat model, jak tu uz nekdo zminil).

Z.T.
-- 
Zdenek Tronicek
Department of Computer Science and Engineering
Prague                   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Quoting Richard Holly <[EMAIL PROTECTED]>:

>  @TransactionAttribute(TransactionAttributeType./REQUIRES_NEW/)
>
>  @TransactionTimeout(18000)
>
>  *public* *void* *doSync*() {
>
>       try {
>
>              // ... Provadej samotny prenos
>
>             if(chybanekonzistence) {
>
>       throw new RuntimeException()
>
> }
>
> } finally
>
>       // uloz reporty                  doUlozReporty( reportslist);       }
>
>  }
>
>
>
>  @TransactionAttribute(TransactionAttributeType./REQUIRES_NEW/)
>
>  *public* *void* *doUlozReporty*( ... reportslist) {
>
>       *ulozReporty*(reportslist);
>
>  }
>
>
>
>
>
>
> Adámek Lukáš  wrote / napísal(a):
>>
>> Hmm, asi jsem to nepopsal dostatecne.
>>
>> Metoda doSync() ma uz nastaveno *REQUIRES_NEW* z duvodu zvetseni   
>> delky transakce (stand.
>>
>> Mame nastavenu delku transakce na 2 minuty, coz staci pro celou   
>> aplikaci, a jen pro tuto metodu
>>
>> mame nastaveno na 5 hodin).
>>
>> Ale v ramci metody doSync() potrebujeme cast jejiho kodu obalit   
>> novou transakci.
>>
>> Zjednodusene:
>>
>>   @TransactionAttribute(TransactionAttributeType./REQUIRES_NEW/)
>>
>>  @TransactionTimeout(18000)
>>
>>  *public* *void* *doSync*() {
>>
>>       try {
>>
>>              // ... Provadej samotny prenos
>>
>>             if(chybanekonzistence) {
>>
>>       throw new RuntimeException()
>>
>> }
>>
>> } finally
>>
>>       // uloz reporty           InitialContext ctx = *new*   
>> *InitialContext*();
>>
>>       UserTransaction ut =   
>> (UserTransaction)ctx.*lookup*("java:comp/UserTransaction");
>>
>>       ut.*begin*();
>>
>>       *ulozReporty*(reportslist);
>>
>>       ut.*commit*();
>>
>>        // v pripade ze nastala nekonzistence
>>
>>    }
>>
>>  }
>>
>> Jelikoz mi runtimeExceptin vyleti ze servisni vrstvy, automaticky   
>> dochazi k rollbacku, ale pritom se zapsali JEN reporty
>>
>> l.
>>
>> ------------------------------------------------------------------------
>>
>> *From:* [EMAIL PROTECTED]   
>> [mailto:[EMAIL PROTECTED] *On Behalf Of *Richard Holly
>> *Sent:* Thursday, November 15, 2007 2:19 PM
>> *To:* Java
>> *Subject:* Re: EJB3 a transakce v transakci
>>
>> Nastavte metode *REQUIRES_NEW.  *
>>
>> Adámek Lukáš  wrote / napísal(a):
>>
>> Ahoj
>>
>> Mame JEE aplikaci, ktera bezi na JBoss 4.0.4.
>>
>> Pouzivame EJB3. Kazda metoda EJBeany bezi jako transakce.
>>
>> Pro synchronizaci dat s produktem 3. strany mame napsanu metodu   
>> Beany pojmenovanou doSync().
>>
>> Metoda doSync() je volana Timerem v nastavenem intervalu.
>>
>> Metoda doSync() zajistuje
>>
>> prenos samotnyh dat
>>
>> ulozeni vyslednych reportu prenosu do db
>>
>> Narazili jsme na problem.
>>
>> Pokud totiz v metode nastane vyjimka, ktera zapricini nemoznost   
>> dalsiho ukladani z duvodu nekonzistence
>>
>> dat v aplikaci 3 strany volame rollback transakce. Tim padem se nam  
>>  ale nezapisou ani reporty.
>>
>> Chteli jsme to vyresit tak, ze v metode doSync(), ktera je obalena   
>> transakci, vytvorime novou sourozeneckou
>>
>> transakci, ktera bude mit za ukol zapsat a comitnout reporty z prenosu.
>>
>> Ulozeni v nove transakci jsme si predstavovali nejak takto:
>>
>> InitialContext ctx = *new* *InitialContext*();
>>
>> UserTransaction ut =   
>> (UserTransaction)ctx.*lookup*("java:comp/UserTransaction");
>>
>> ut.*begin*();
>>
>> *ulozReporty*(reportslist);
>>
>> ut.*commit*();
>>
>> Problem je ze vysledkem je:
>>
>> Transaction already active, cannot nest transactions.
>>
>> Jak se podobne problemy resi v EJB3, kdyz neni mozne jakkoliv z transakce
>>
>> vytvorit novou transakci (at uz potomka, nebo sourozence)
>>
>>  Diky
>>
>> Lukas Adamek
>>
>>




Odpovedet emailem