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