9 Replies Latest reply on Feb 9, 2006 4:39 PM by winjer

    cannot jbpmSession.commitTransaction()

    winjer

      hello,

      i have the following code inside a method which is being called from an onMessage() method of an MDB :

      JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
      jbpmSession.beginTransaction();
      jbpmSession.getGraphSession().saveProcessInstance(processInstance);
      System.out.println("[ProcessExecution] Saved processInstance with ID:"+processInstance.getId());
      jbpmSession.commitTransaction();
      jbpmSession.close();
      

      And i m getting the following error and stack trace:
      22:36:31,515 ERROR [JDBCTransaction] JDBC commit failed
      java.sql.SQLException: You cannot commit during a managed transaction!
       at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:432)
       at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:331)
       at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
       at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115)
       at org.jbpm.db.JbpmSession.commitTransaction(JbpmSession.java:103)
       at com.adminsys.ejb.ProcessExecutionFacadeBean.storeProcessInstance(ProcessExecutionFacadeBean.java:126)
       at com.adminsys.ejb.ProcessExecutionFacadeBean.endTaskOfProcess(ProcessExecutionFacadeBean.java:284)
       at com.adminsys.ejb.TaskEvaluatedBean.onMessage(TaskEvaluatedBean.java:102)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:324)
       at org.jboss.invocation.Invocation.performCall(Invocation.java:345)
       at org.jboss.ejb.MessageDrivenContainer$ContainerInterceptor.invoke(MessageDrivenContainer.java:475)
       at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:149)
       at org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor.invoke(MessageDrivenInstanceInterceptor.java:101)
       at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:48)
       at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:106)
       at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:335)
       at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:166)
       at org.jboss.ejb.plugins.RunAsSecurityInterceptor.invoke(RunAsSecurityInterceptor.java:94)
       at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)
       at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)
       at org.jboss.ejb.MessageDrivenContainer.internalInvoke(MessageDrivenContainer.java:389)
       at org.jboss.ejb.Container.invoke(Container.java:873)
       at org.jboss.ejb.plugins.jms.JMSContainerInvoker.invoke(JMSContainerInvoker.java:1077)
       at org.jboss.ejb.plugins.jms.JMSContainerInvoker$MessageListenerImpl.onMessage(JMSContainerInvoker.java:1379)
       at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:256)
       at org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageConsumer.java:904)
       at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:160)
       at org.jboss.mq.SpySession.run(SpySession.java:333)
       at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:180)
       at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)
       at java.lang.Thread.run(Thread.java:536)
      22:36:31,546 ERROR [JbpmSession] org.hibernate.TransactionException: JDBC commit failed
      22:36:31,546 INFO [STDOUT] java.lang.RuntimeException: couldn't commit transaction
      22:36:31,546 INFO [STDOUT] at org.jbpm.db.JbpmSession.commitTransaction(JbpmSession.java:107)
      22:36:31,546 INFO [STDOUT] at com.adminsys.ejb.ProcessExecutionFacadeBean.storeProcessInstance(ProcessExecutionFacadeBean.java:126)
      22:36:31,546 INFO [STDOUT] at com.adminsys.ejb.ProcessExecutionFacadeBean.endTaskOfProcess(ProcessExecutionFacadeBean.java:284)
      22:36:31,546 INFO [STDOUT] at com.adminsys.ejb.TaskEvaluatedBean.onMessage(TaskEvaluatedBean.java:102)
      22:36:31,546 INFO [STDOUT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      22:36:31,546 INFO [STDOUT] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      22:36:31,546 INFO [STDOUT] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      22:36:31,546 INFO [STDOUT] at java.lang.reflect.Method.invoke(Method.java:324)
      22:36:31,546 INFO [STDOUT] at org.jboss.invocation.Invocation.performCall(Invocation.java:345)
      22:36:31,546 INFO [STDOUT] at org.jboss.ejb.MessageDrivenContainer$ContainerInterceptor.invoke(MessageDrivenContainer.java:475)
      22:36:31,562 INFO [STDOUT] at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:
      149)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor.invoke(MessageDrivenInstanceInterceptor.java:101)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:48)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:106)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:335)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:166)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.RunAsSecurityInterceptor.invoke(RunAsSecurityInterceptor.java:94)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.MessageDrivenContainer.internalInvoke(MessageDrivenContainer.java:389)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.Container.invoke(Container.java:873)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.jms.JMSContainerInvoker.invoke(JMSContainerInvoker.java:1077)
      22:36:31,562 INFO [STDOUT] at org.jboss.ejb.plugins.jms.JMSContainerInvoker$MessageListenerImpl.onMessage(JMSContainerInvoker.java:1379
      )
      22:36:31,562 INFO [STDOUT] at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:256)
      22:36:31,578 INFO [STDOUT] at org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageConsumer.java:904)
      22:36:31,578 INFO [STDOUT] at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:160)
      22:36:31,578 INFO [STDOUT] at org.jboss.mq.SpySession.run(SpySession.java:333)
      22:36:31,578 INFO [STDOUT] at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:180)
      22:36:31,578 INFO [STDOUT] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)
      22:36:31,578 INFO [STDOUT] at java.lang.Thread.run(Thread.java:536)
      22:36:31,578 INFO [STDOUT] Caused by: org.hibernate.TransactionException: JDBC commit failed
      22:36:31,578 INFO [STDOUT] at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:130)
      22:36:31,578 INFO [STDOUT] at org.jbpm.db.JbpmSession.commitTransaction(JbpmSession.java:103)
      22:36:31,578 INFO [STDOUT] ... 29 more
      22:36:31,593 INFO [STDOUT] Caused by: java.sql.SQLException: You cannot commit during a managed transaction!
      22:36:31,593 INFO [STDOUT] at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java
      :432)
      22:36:31,593 INFO [STDOUT] at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:331)
      22:36:31,593 INFO [STDOUT] at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
      22:36:31,593 INFO [STDOUT] at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115)
      22:36:31,593 INFO [STDOUT] ... 30 more
      
      


      If i leave out the jbpmSession.commitTransaction(); i have problem with the persistence of my processInstance later on in the execution of my code; it's not retrieved correct from the db.
      Any ideas?
      Thanks

        • 1. Re: cannot jbpmSession.commitTransaction()
          iterrell

          I've had similar errors using EJB Timers. I believe what is going on is that your application server is managing your transactions but that is not getting communicated to jBPM's Hibernate.

          Since my timer's logic was simple and purely jBPM related, I solved the problem by letting the bean manage its own transactions. With EJB3 you can tag the bean with:

          @TransactionManagement(TransactionManagementType.BEAN)
          


          • 2. Re: cannot jbpmSession.commitTransaction()
            winjer

            thanks, though unfortunately i dont know how to implement what you suggest in my case...
            If i am right, the problem occurs because i have stated that the MDB transactions are handled
            by the container (JBOSS)
            [MDB xdoclet settings: transaction-type="Container" ]

            Anyone knows how to make it work?

            • 3. Re: cannot jbpmSession.commitTransaction()
              ralfoeldi

              You will need to configure Hibernate to use container managed transactions. Its in the docs somewhere. If you haven't found it by then, I'll post it in a few hours (sorry, not in the office right now.)

              Greetings

              • 4. Re: cannot jbpmSession.commitTransaction()
                iterrell

                Alternatively, you could probably use xdoclet as:
                [MDB xdoclet settings: transaction-type="Bean" ]

                Don't quote that as gospel; just guessing. :)

                • 5. Re: cannot jbpmSession.commitTransaction()
                  ralfoeldi

                  ... which you wouldn't want to do as your workflow would then be in another transaction then the acceptance of the message and you be losing all transactional security.

                  Quote that as gospel :-)

                  • 6. Re: cannot jbpmSession.commitTransaction()
                    winjer

                    thanks for the replies.
                    yes, changing the MDB xdoclet settings (transaction-type="Bean" ) is not what i need :)

                    RAlfoeldi, i d appreciate it if you could paste the hibernate here, i havent get it to work yet :S

                    thanks again.

                    • 7. Re: cannot jbpmSession.commitTransaction()
                      ralfoeldi

                      This is a Oracle / JBoss configuration:


                      <hibernate-configuration>
                      
                       <!-- a SessionFactory instance listed as /jndi/name -->
                       <session-factory
                       name="java:hibernate/SessionFactory">
                      
                       <!-- properties -->
                       <property name="connection.datasource">java:jdbc/xxxx/JBPM</property>
                       <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
                       <property name="show_sql">false</property>
                       <property name="hibernate.transaction.factory_class">
                       org.hibernate.transaction.CMTTransactionFactory
                       </property>
                       <property name ="hibernate.transaction.manager_lookup_class">
                       org.hibernate.transaction.JBossTransactionManagerLookup
                       </property>
                      ...
                      


                      Have a look at the Hibernate documentation on the various transaction managers that are possible.

                      Greetings

                      • 8. Re: cannot jbpmSession.commitTransaction()
                        iterrell

                        Maybe I can try to be at least a little useful then, after that bad advice. ;-)

                        Using JBoss 4.0.3 I have:

                        hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
                        hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup
                        


                        in my jbpm.hibernate.properties file, so as to not have to edit the hibernate xml config.

                        • 9. Re: cannot jbpmSession.commitTransaction()
                          winjer

                          thank you both guys, i really appreciate it ;-)