Transaction problem I'm updating in bach thousands of independent records. in a sheduled Seam batch process
I do not want the overhead to start and stop a session for every individual record. so I prefere the sequence | /hibernate factory creation | /get entity manager - session | | loop | begin transaction | if error ----- something is wrong in my setup | .... | process the transaction | if error ----- role back this transaction but CONTINUE the loop | else | flush transactiom | if error ----- role back this transaction but CONTINUE the loop | else Comit the transaction and hope it seen in the database right away | check for more work to do (often wait for predetermened externam messages (response time 1-2 sec but sometines connection problems | if connection problem abort the proces and try the whole lot somewhat later | endloop | this process runs into many problems: I use seam 2.0.0.ga quarts as sheduler (works ok) problem 1: I do not see any updates during the loop (as if the flush doesn't work) problem 2: as any rollback occurs, the process is dead and I can not recover any information any more implicitely I lose the whole process. the rollback rolls-back the full loop. problem 3: i run into session timeouts after exactly 5 minutes and so lose the transaction at times hereby losing everything using seam i switched of Seam transaction controll / but i still suspect there is a hidden Seam transaction covering all the loops transaction -problem 1 and problem 2 as documented I needed to shitch off seam transaction management transaction-management-enabled="false" in components.xml | ?xml version="1.0" encoding="UTF-8"?> | <components xmlns="http://jboss.com/products/seam/components" | xmlns:core="http://jboss.com/products/seam/core" | xmlns:persistence="http://jboss.com/products/seam/persistence" | xmlns:drools="http://jboss.com/products/seam/drools" | xmlns:async="http://jboss.com/products/seam/async" | xmlns:bpm="http://jboss.com/products/seam/bpm" | xmlns:security="http://jboss.com/products/seam/security" | xmlns:mail="http://jboss.com/products/seam/mail" | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | xsi:schemaLocation= | "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.0.xsd | http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.0.xsd | http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.0.xsd | http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.0.xsd | http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.0.xsd | http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.0.xsd | http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd"> | <!-- transaction mangement jpa manual <core:init debug="@debug@" jndi-pattern="@jndiPattern@" />--> | <core:init debug="@debug@" jndi-pattern="@jndiPattern@" transaction-management-enabled="false" /> | conversation-timeout="12000000" --> | <core:manager concurrent-request-timeout="5000000" | conversation-timeout="200000000" | conversation-id-parameter="cid"/> | | <persistence:managed-persistence-context name="entityManager" | auto-create="true" | persistence-unit-jndi-name="java:/httpscanEntityManagerFactory"/> | | | | | <drools:rule-base name="securityRules"> | <drools:rule-files> | <value>/security.drl</value> | </drools:rule-files> | </drools:rule-base> | | <security:identity authenticate-method="#{authenticator.authenticate}" | security-rules="#{securityRules}"/> | | <event type="org.jboss.seam.notLoggedIn"> | <action execute="#{redirect.captureCurrentView}"/> | </event> | <event type="org.jboss.seam.postAuthenticate"> | <action execute="#{redirect.returnToCapturedView}"/> | </event> | ... | i use JTA and create a delegate session sesson=em.delegate | /hibernate factory creation (allow seam use the JTA EM injection) | Session ses=ses=(Session) em.getDelegate();//get the session/get entity manager - session | | @transaction | class.... | | loop | if (ses!=null) txn=ses.beginTransaction();//begin transaction | if error ----- something is wrong in my setup | .... | process the transaction | if error ----- catch (Exception er) {result.returnCode=-1;errcod=er; | **** String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); | if (errmsg.indexOf("NullPointerException")>-1) | log.error(env+" nullpointer exception failed "+ errmsg,er); | else log.error(env+" begin transaction error "+ errmsg); | try {//rollback cover | if (ses!=null) txn.rollback(); | } catch (Exception erx) | {errcod=erx; | String erxmsg=erx.getClass().getSimpleName() +" err: "+ erx.getMessage(); | log.error(env+" Rollback transaction failed "+ erxmsg +" From "+ errmsg); | } | } | | | else | if (ses!=null) ses.flush();//flush transactiom | if error -----catch (Exception er) {result.returnCode=-1;errcod=er; | String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); | if (errmsg.indexOf("NullPointerException")>-1) | log.error(env+" nullpointer exception failed "+ errmsg,er); | else log.error(env+" flush error "+ errmsg); | try {//rollback cover | if (ses!=null) txn.rollback(); | } catch (Exception erx) | {errcod=erx; | String erxmsg=erx.getClass().getSimpleName() +" err: "+ erx.getMessage(); | log.error(env+" Rollback transaction failed "+ erxmsg +" From "+ errmsg); | } | } | else if (ses!=null) txn.commit();//Comit the transaction and hope it seen in the database right away | if error ----- catch (Exception er) {result.returnCode=-1;errcod=er; | String errmsg=er.getClass().getSimpleName() +" err: "+ er.getMessage(); | if (errmsg.indexOf("NullPointerException")>-1) | log.error(env+" nullpointer exception failed "+ errmsg,er); | else log.error(env+" comit error "+ errmsg); | try {//rollback cover | if (ses!=null) txn.rollback(); | } catch (Exception erx) | {errcod=erx; | String erxmsg=erx.getClass().getSimpleName() +" err: "+ erx.getMessage(); | log.error(env+" Rollback transaction failed "+ erxmsg +" From "+ errmsg); | } | } | | check for more work to do (often wait for predetermened externam messages (response time 1-2 sec but sometines connection problems | if connection problem abort the proces and try the whole lot somewhat later | endloop | although the error is probably created by a session timeout. i have no idea how to change the session timeout to more then 5 minutes | Transaction is not active: tx=TransactionImple < ac, BasicAction: a0000c8:453:478ddaee:209 status: ActionStatus.ABORTING >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: a0000c8:453:478ddaee:209 status: ActionStatus.ABORTING >) | Questions: 1-Why am I not effectifely deacivating (Seam transaction intervention ?) should be handled since modif of components.xml -DB not visualy updated by the Flush 2-As a problem of any kind occurs I roll back the last transaction why is it rolling back the full loop ( dependent on question 1 ?) 3-how do I handle the time out All help is welcome View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4120392#4120392 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4120392 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user