6 Replies Latest reply on Nov 3, 2009 3:54 AM by jbarrez

    Timer throwing exception intermittently

    sridhar18

      Hi,
      I'm getting the following error at times when my timers are firing.
      11:19:51,157 ERROR [ExecuteJobCmd] exception while executing 'timer[46|2009-10-28 11:19:51,040|timeout]'
      org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [org.jbpm.pvm.internal.model.ExecutionImpl#152]
      at org.hibernate.impl.SessionFactoryImpl$2.handleEntityNotFound(SessionFactoryImpl.java:409)
      at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:108)
      at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:97)
      at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
      at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
      at org.jbpm.pvm.internal.model.ExecutionImpl_$$_javassist_4.getActivity(ExecutionImpl_$$_javassist_4.java)
      at org.jbpm.pvm.internal.job.TimerImpl.execute(TimerImpl.java:94)
      at org.jbpm.pvm.internal.job.TimerImpl.execute(TimerImpl.java:52)
      at org.jbpm.pvm.internal.cmd.ExecuteJobCmd.execute(ExecuteJobCmd.java:76)
      at org.jbpm.pvm.internal.cmd.ExecuteJobCmd.execute(ExecuteJobCmd.java:42)
      at org.jbpm.pvm.internal.svc.DefaultCommandService.execute(DefaultCommandService.java:42)
      at org.jbpm.pvm.internal.tx.jta.JtaTransactionInterceptor.executeInNewTx(JtaTransactionInterceptor.java:79)
      at org.jbpm.pvm.internal.tx.jta.JtaTransactionInterceptor.execute(JtaTransactionInterceptor.java:61)
      at org.jbpm.pvm.internal.svc.RetryInterceptor.execute(RetryInterceptor.java:55)
      at org.jbpm.pvm.internal.tx.jta.JtaRetryInterceptor.executeWithRetry(JtaRetryInterceptor.java:52)
      at org.jbpm.pvm.internal.tx.jta.JtaRetryInterceptor.execute(JtaRetryInterceptor.java:45)
      at org.jbpm.pvm.internal.svc.EnvironmentInterceptor.execute(EnvironmentInterceptor.java:46)
      at org.jbpm.pvm.internal.jobexecutor.JobParcel.run(JobParcel.java:48)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)

      Sample timer in my process definition:

       <state g="138,450,127,52" name="Validate">
       <on event="timeout">
       <timer name="checkValidity" duedate="3 minutes" repeat="2 minutes"/>
       <event-listener class="some.class.CheckValidityEvent">
       <field name="idType"><string value="ID"/></field>
       </event-listener>
       </on>
       <transition g="-72,-22" name="valid" to="complete"/>
       <transition g="-72,-22" name="invalid" to="end"/>
       </state>
      


      The timers tend to exist though and run just fine on the next timeout.
      I'm using jbpm 4.1 on jboss 5.1. Thanks in advance.

        • 1. Re: Timer throwing exception intermittently
          jbarrez

          Could you provide a basic test case for this so we can test it against trunk?

          • 2. Re: Timer throwing exception intermittently
            sridhar18

            Sure. Thanks for the response. You could use the below process defnintion and EventListener class to try to reproduce this:

            <?xml version="1.0" encoding="UTF-8"?>
            
            <process name="MyWorkflow" xmlns="http://jbpm.org/4.0/jpdl">
            
             <start g="11,265,80,40">
             <transition to="fork"/>
             </start>
            
             <fork g="76,263,80,40" name="fork">
             <transition to="ValidateOne"/>
             <transition to="ValidateTwo"/>
             </fork>
            
             <state g="138,450,127,52" name="ValidateOne">
             <on event="timeout">
             <timer name="checkValidityForOne" duedate="3 minutes" repeat="2 minutes"/>
             <event-listener class="some.class.CheckValidityOneEvent">
             <field name="idType"><string value="ID_ONE"/></field>
             </event-listener>
             </on>
             <transition g="-72,-22" name="valid" to="complete"/>
             <transition g="-72,-22" name="invalid" to="end"/>
             </state>
            
             <state g="138,450,127,52" name="ValidateTwo">
             <on event="timeout">
             <timer name="checkValidityForTwo" duedate="4 minutes" repeat="5 minutes"/>
             <event-listener class="some.class.CheckValidityTwoEvent">
             <field name="idType"><string value="ID_TWO"/></field>
             </event-listener>
             </on>
             <transition g="-72,-22" name="valid" to="complete"/>
             <transition g="-72,-22" name="invalid" to="end"/>
             </state>
            
             <join g="706,212,48,48" multiplicity="2" name="complete">
             <transition to="end"/>
             </join>
            
             <end g="779,213,48,48" name="end"/>
            </process>
            


            It just has a fork, two concurrent activities (events), and a join.

            My sample event listener class:
            @SuppressWarnings("serial")
            public class CheckValidityOneEvent implements EventListener {
             private final Logger log = Logger.getLogger(this.getClass());
            
             @Override
             public void notify(EventListenerExecution execution) throws Exception {
             try {
             // business logic, check for condition
            
             // if condition met, signal execution by id
             executionService.signalExecutionById(execution.getId(), "valid");
            
             // otherwise, do nothing
             } catch (Exception ex) {
             // catch all exceptions and don't rethrow them.
             log.error("Exception occured: " + ex.getMessage());
             }
             }
            }
            

            So on each timeout, the timer will perform a check and transitions to valid only if the check is successful. Otherwise it does nothing. I won't throw any exceptions up the chain.
            I have my .bar and library jar deployed to jboss 5.1 GA. Let me know if you need anymore information.
            Thanks.




            • 3. Re: Timer throwing exception intermittently
              kukeltje

              Could this by accident be related to the cases with two tasks in forks? Might be different symptoms of the same issue.

              @Sridhar: If you could make a testcase like in http://www.jboss.org/index.html?module=bb&op=viewtopic&t=158424 that would save Joram some time.

              • 4. Re: Timer throwing exception intermittently
                sridhar18

                Kukeltje,
                I'm not following when you say two tasks in fork. Could you elaborate a bit more on it? Thanks.

                • 5. Re: Timer throwing exception intermittently
                  sridhar18

                  I found the reason for this behavior.

                  I have repeat timers in my process definition. The timeout event listeners for those timers check for a particular condition and if it is met, transition to a new activity. What's happening in that case is for some reason, though the timer is getting deleted from the database, the timer id is still being used by DispatcherThread class. It passes along this id to the ExecuteJobCmd which throws the exception I posted above as it can't find any timer in the database by that id. It retries upto 3 times and then gives up. That's why I see the exception throws 3 times in the logs.

                  So is there a better way we could turn off the repeat timers when transitioning to a new activity?

                  • 6. Re: Timer throwing exception intermittently
                    jbarrez

                    If the functionality is as you describe, then it is a bug. Can you debug the code and find out why exactly the id is still in the DispatcherThread (coincidence?)