0 Replies Latest reply on Mar 31, 2008 10:34 PM by pras mn

    JTA Transaction support for jbpm - Issues with SeamPhaseList

    pras mn Newbie

      The issue here seems to be this:

      I obtain a UserTransaction at the start of the method and in case of error, I call rollback in catch block. But the rollback is intercepted by the SeamPhaseListener which tries to begin a transaction and I get the error
      " Could not start transaction:

      How do I disable SeamPhaseListener from starting a new transaction?

      More Details
      I am having issues creating a new UserTransaction in a jbpm process using Hibernate. Am I missing anything in order to create a JTA User transaction and then bind the Hibernate session within the transaction? Please advise
      Any advice greatly appreciated

      My Code

      public String createXXXXX()
      JbpmContext jbpmContext = null;
      Session session = null;
      UserTransaction tx = null;
      jbpmContext = JbpmUtil.getJbpmContext();
      session = HibernateUtil.getSession();
      System.out.println("About to start tx");
      tx = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");

      while ( ...) {
      ..... 1. Perform custom DB operations using session
      2. Persist ProcessInstance, Task using the same session

      // throw error to test rollback
      } catch ( Exception e)

      When Tx is rolled back, I expect that all DB operations and jbPM operations shoudl be rolled back. Instead I see this strange behavior:

      When I lookup the transaction from InitialContext, the trasnaction statuis is already active!
      **************** TX STATUS: 0

      So, when I rollback the transaction I get the error:

      java.lang.IllegalStateException: Could not start transaction
      at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:571
      at org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsBeforePhase(Se
      at org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseList
      at org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.ja

      Caused by: javax.transaction.NotSupportedException: transaction is already active
      at org.jboss.seam.transaction.HibernateTransaction.assertNotActive(Hiber
      at org.jboss.seam.transaction.HibernateTransaction.begin(HibernateTransa
      at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:566



      < service name="persistence" >
      < factory>
      < bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
      < field name="isTransactionEnabled"> < false/>
      < field name="isCurrentSessionEnabled"> < false />
      </ bean>
      </ factory>
      </ service>
      < service name="tx" factory="org.jbpm.tx.TxServiceFactory" />
      < service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
      < service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
      < service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
      < service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
      </ jbpm-context>


      <session-factory name="java:/bookingDatabase">
      < property name="connection.datasource">java:/DefaultDS
      < property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider
      < property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory
      < property name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup
      < property name="transaction.flush_before_completion">true
      <!-- org.hibernate.transaction.JDBCTransactionFactory -->
      < property name="jta.UserTransaction">java:comp/UserTransaction
      < property name="hibernate.show_sql">true

      <!-- Use the Hibernate built-in pool for tests. -->
      < property name="connection.pool_size">1