[jboss-user] [JBoss jBPM] - Failure when ending process

john.rojas do-not-reply at jboss.com
Sun Oct 15 21:01:20 EDT 2006


Hi,

I have a process that loops to a wait state. The wait state uses a timer to perform a number of actions -- see process definition below. Everything runs fine until the Decision node determines that it is time for the process to end. The return("end-transition") eventually throws the exception shown below.

The ProcessManager shown is where the process is started from, and once the process is started, it waits for the Decision node to raise a flag that the process is ending. The exception is thrown before the process.end() statement is called.

I think I am not ending the process appropriately, and that it has to do with the timer. I tried cancelling the timer and suspending the timer, but either approach did not work. Should I be stopping the SchedulerThread? If so, how do I do that?

Thanks in advance for your help!

John


HERE IS THE PROCESS DEFINITION:

  | <?xml version="1.0" encoding="UTF-8"?>
  | 
  | <process-definition
  |   xmlns=""  name="Load Confirm Data Process">
  |    <start-state name="start">
  |       <transition name="" to="Wait For Start Time"></transition>
  |    </start-state>
  |    <state name="Wait For Start Time">
  |       <event type="node-enter">
  |          <action name="confirm-create-custom-timer-action" class="com.pb.mms.automation.ActionHandlers$CreateCustomTimerAction">
  |             <timerName>start-confirm-automated-tasks</timerName>
  |              <startTime></startTime> 
  |             <dueDate>0 seconds</dueDate>
  |             <repeat>30 seconds</repeat>
  |             <transitionName>time-out-transition</transitionName>
  | <!--             <actionName>FireTimerAction</actionName>  -->
  |          </action>
  |       </event>
  |       <event type="node-leave">
  |       	<action name="FireTimerAction" class='com.pb.mms.automation.ActionHandlers$FireTimerAction' />
  |       </event>
  |       <transition name="time-out-transition" to="fork1"></transition>
  |    </state>
  |    <fork name="fork1">
  |       <transition name="do-pkg-transition" to="Load PKG Files"></transition>
  |       <transition name="do-pts-transition" to="Load PTS Files"></transition>
  |    </fork>
  |    <node name="Load PKG Files">
  |       <event type="node-enter">
  |          <action name="load-pkg-files-action" class='com.pb.mms.automation.ActionHandlers$RunMmsServiceAction'>
  | 	         <serviceClass>test.com.pb.mms.bso.TestMmsService</serviceClass>
  | 			  <serviceArguments>
  | 			    <entry><key>dataSetName</key><value>Loadedpkg</value></entry>
  | 			  </serviceArguments>
  | 		  </action>
  |       </event>
  |       <transition name="" to="join1"></transition>
  |    </node>
  |    <node name="Load PTS Files">
  |       <event type="node-enter">
  |          <action name="load-pts-files-action" class='com.pb.mms.automation.ActionHandlers$RunMmsServiceAction'>
  | 	         <serviceClass>test.com.pb.mms.bso.TestMmsService</serviceClass>
  | 			  <serviceArguments>
  | 			    <entry><key>dataSetName</key><value>Loadedpts</value></entry>
  | 			  </serviceArguments>
  | 		  </action>
  |       </event>
  |       <transition name="" to="join1"></transition>
  |    </node>
  |    <join name="join1">
  |       <transition name="" to="Refresh Campaign Curves"></transition>
  |    </join>
  |    <node name="Refresh Campaign Curves">
  |       <event type="node-enter">
  |          <action name="refresh-campaign-curves-action" class='com.pb.mms.automation.ActionHandlers$RunMmsServiceAction'>
  | 	         <serviceClass>test.com.pb.mms.bso.TestMmsService</serviceClass>
  | 			  <serviceArguments>
  | 			     <entry><key>test variable</key><value>CurveCreationService</value></entry>
  | 			  </serviceArguments>
  | 		  </action>
  |       </event>
  |       <transition name="" to="Close Completed Campaigns"></transition>
  |    </node>
  |    <node name="Close Completed Campaigns">
  |       <event type="node-enter">
  |          <action name="close-completed-campaigns-action" class='com.pb.mms.automation.ActionHandlers$RunMmsServiceAction'>
  | 	         <serviceClass>test.com.pb.mms.bso.TestMmsService</serviceClass>
  | 			  <serviceArguments>
  | 			     <entry><key>test variable</key><value>CampaignCompletionService</value></entry>
  | 			  </serviceArguments>
  | 		  </action>
  |       </event>
  |       <transition name="" to="Refresh Completed Campaign Curves"></transition>
  |    </node>
  |    <decision name="Continue Or Shutdown">
  |       <handler class='com.pb.mms.automation.ActionHandlers$EndOrRepeatDecision' />
  |       <transition name="repeat-transition" to="Wait For Start Time"></transition>
  |       <transition name="end-transition" to="end1"></transition>
  |    </decision>
  |    <end-state name="end1"></end-state>
  |    <node name="Refresh Completed Campaign Curves">
  |       <event type="node-enter">
  |          <action name="refresh-completed-campaign-curves-action" class='com.pb.mms.automation.ActionHandlers$RunMmsServiceAction'>
  | 	         <serviceClass>test.com.pb.mms.bso.TestMmsService</serviceClass>
  | 			  <serviceArguments>
  | 			     <entry><key>test variable</key><value>CurveCreationService for completed campaigns</value></entry>
  | 			  </serviceArguments>
  | 		  </action>
  |       </event>
  |       <transition name="" to="Continue Or Shutdown"></transition>
  |    </node>
  | </process-definition>
  | 

HERE IS THE PROCESS MANAGER:

  | package com.pb.mms.automation;
  | 
  | 
  | import java.io.FileInputStream;
  | 
  | import junit.framework.TestCase;
  | 
  | import org.apache.log4j.Logger;
  | import org.apache.log4j.PropertyConfigurator;
  | import org.jbpm.JbpmConfiguration;
  | import org.jbpm.JbpmContext;
  | import org.jbpm.context.exe.ContextInstance;
  | import org.jbpm.db.GraphSession;
  | import org.jbpm.graph.def.ProcessDefinition;
  | import org.jbpm.graph.exe.ProcessInstance;
  | import org.jbpm.graph.exe.Token;
  | import org.jbpm.scheduler.impl.SchedulerThread;
  | 
  | 
  | /**
  |  * @author rojasjw
  |  *
  |  */
  | public class ProcessManager extends TestCase
  | {
  | 
  |   static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
  |   
  |   Logger logger = Logger.getLogger( ProcessManager.class );
  |   
  | //  static final String processName = "TimerTestProcess";
  |   static final String processName = "Load Confirm Data Process";
  |   
  |   static
  |   {
  |     // configure the logger
  |     PropertyConfigurator.configure("src/config.files/log4j.properties");
  |   }
  | 
  | 
  |   public void testProcess() throws Exception
  |   {
  |       deployProcessDefinition();
  |       
  |       long id = signalProcessToStart();
  |       
  |       runScheduler();
  |       
  |       waitForProcessToEnd( id );
  |   }
  | 
  | 
  |   /**
  |    * 
  |    */
  |   private void deployProcessDefinition() throws Exception
  |   {
  |     JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  |     try
  |     {
  |       // Deploy the process definition if not already deployed
  |       GraphSession graphSession = jbpmContext.getGraphSession();
  |       ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition( processName );
  | //      if( processDefinition == null )
  | //      {
  |         FileInputStream fis = new FileInputStream("processes/" + processName + "/processdefinition.xml");
  |         processDefinition = ProcessDefinition.parseXmlInputStream(fis);
  | 
  |         // Deploy the process definition in the database 
  |         jbpmContext.deployProcessDefinition(processDefinition);
  | //      }
  |       
  |       assertNotNull( "Definition should not be null", processDefinition );
  | 
  |     }
  |     finally
  |     {
  |       jbpmContext.close();
  |     }
  |   }
  | 
  | 
  |   /**
  |    * 
  |    */
  |   private long signalProcessToStart() throws Exception
  |   {
  |     // Lookup the pojo persistence context-builder that is configured above
  |     JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  |     try
  |     {
  |       GraphSession graphSession = jbpmContext.getGraphSession();
  |       
  |       ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition( processName );
  |       assertNotNull( "Definition should not be null", processDefinition );
  | 
  |       // With the processDefinition that we retrieved from the database, we
  |       // can create an execution of the process definition just like in the
  |       // hello world example (which was without persistence).
  |       ProcessInstance processInstance = new ProcessInstance( processDefinition );
  |       assertNotNull( "Instance should not be null", processInstance );
  | 
  |       Token token = processInstance.getRootToken();
  |       assertEquals( "start", token.getNode().getName() );
  |       
  |       // Let's start the process execution
  |       token.signal();
  |       
  |       // Now the processInstance is saved in the database. So the
  |       // current state of the execution of the process is stored in the
  |       // database.
  |       jbpmContext.save( processInstance );
  | 
  |       return processInstance.getId();
  |     }
  |     finally
  |     {
  |       // Tear down the pojo persistence context.
  |       jbpmContext.close();
  |     }
  |   }
  | 
  |   /**
  |    * 
  |    */
  |   private void waitForProcessToEnd( long id ) throws Exception
  |   {
  |     while( !processNeedsToEnd( id ) )
  |     {
  |       logger.info( "@@@@@@@@@@@@@@@@@@@@@@@ waiting for process to end......" );
  |       
  |       Thread.sleep( 20000 );
  |     }
  | 
  |     endProcess( id );
  |   }
  | 
  |   
  |   /**
  |    * 
  |    */
  |   private boolean processNeedsToEnd( long id ) throws Exception
  |   {
  |     // Lookup the pojo persistence context-builder that is configured above
  |     JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  |     try
  |     {
  |       GraphSession graphSession = jbpmContext.getGraphSession();
  | 
  |       // Use the process instance id to retrieve the process instance
  |       ProcessInstance processInstance = graphSession.loadProcessInstance( id );
  |         
  |       // See what state the process is in 
  |       logger.info( "@@@@@@@@@@@@@@@@@@@@@@@ The processInstance=" + processInstance.getId() + " is in the following node: " + processInstance.getRootToken().getNode().getFullyQualifiedName() );
  |       
  |       ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
  |       
  |       Object requestEndProcess = contextInstance.getVariable( "request-end-process" );
  |       if( requestEndProcess != null )
  |         return true;
  |       else
  |         return false;
  |     }
  |     finally
  |     {
  |       // Tear down the pojo persistence context.
  |       jbpmContext.close();
  |     }
  |   }
  | 
  | 
  | 
  |   /**
  |    * THIS METHOD IS NEVER CALLED
  |    */
  |   private void endProcess( long id ) throws Exception
  |   {
  | 
  |     // Lookup the pojo persistence context-builder that is configured above
  |     JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  |     try
  |     {
  |       GraphSession graphSession = jbpmContext.getGraphSession();
  | 
  |       // Use the process instance id to retrieve the process instance
  |       ProcessInstance processInstance = graphSession.loadProcessInstance( id );
  |         
  |       // See what state the process is in 
  |       logger.info( "@@@@@@@@@@@@@@@@@@@@@@@ The processInstance=" + processInstance.getId() 
  |         + " is in the following node: " + processInstance.getRootToken().getNode().getFullyQualifiedName() );
  |       
  |       // THE EXCEPTION OCCURS BEFORE THIS POINT
  |       // end the process -- 
  |       while( !processInstance.hasEnded() )
  |         processInstance.end();
  | 
  |       logger.info( "@@@@@@@@@@@@@@@@@@@@@@@ The processInstance=" + processInstance.getId() + " : " 
  |         + processInstance.getProcessDefinition().getName() + " HAS ENDED" );
  |       
  |       // Now the processInstance is saved in the database. So the
  |       // current state of the execution of the process is stored in the
  |       // database.
  |       logger.info( "@@@@@@@@@@@@@@@@@@@@@@@ Saving the ended processInstance=" + processInstance.getId() + " : " + processInstance.getProcessDefinition().getName() );
  |       jbpmContext.save( processInstance );
  |       // The method below will get the process instance back out
  |       // of the database and resume execution by providing another
  |       // external signal.
  |     }
  |     finally
  |     {
  |       // Tear down the pojo persistence context.
  |       jbpmContext.close();
  |     }
  |   }
  | 
  |   
  |   public void runScheduler() throws Exception
  |   {
  | //    // Lookup the pojo persistence context-builder that is configured above
  | //    JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  | //    try
  | //    {
  |       SchedulerThread schedulerThread = new SchedulerThread();
  |       schedulerThread.start();
  | //    }
  | //    finally
  | //    {
  | //      // Tear down the pojo persistence context.
  | //      jbpmContext.close();
  | //    }
  |   }
  | }
  | 

HERE ARE THE ACTION HANDLERS:

  | package com.pb.mms.automation;
  | 
  | import java.text.SimpleDateFormat;
  | import java.util.Calendar;
  | import java.util.Date;
  | import java.util.GregorianCalendar;
  | import java.util.Map;
  | 
  | import org.apache.log4j.Logger;
  | import org.jbpm.calendar.BusinessCalendar;
  | import org.jbpm.calendar.Duration;
  | import org.jbpm.context.exe.ContextInstance;
  | import org.jbpm.graph.def.ActionHandler;
  | import org.jbpm.graph.exe.ExecutionContext;
  | import org.jbpm.graph.exe.ProcessInstance;
  | import org.jbpm.graph.exe.Token;
  | import org.jbpm.graph.node.DecisionHandler;
  | import org.jbpm.scheduler.SchedulerService;
  | import org.jbpm.scheduler.exe.Timer;
  | import org.jbpm.svc.Services;
  | 
  | public class ActionHandlers 
  | {
  |   static Timer timer = null;
  |   static Logger logger = Logger.getLogger( ActionHandlers.class );
  |   
  |   private static int counter = 3;
  | 
  |   /**
  |    * Used to calculate a date in the future, that takes place at the hours, minutes, seconds specified in 
  |    * the indicated startTime. The startTime is formatted in 24 hour format, such as 15:23:21.
  |    * 
  |    * @param startTime - String holding the hours, minutes, seconds, formatted as 'HH:MM:SS' in 24 hour format. 
  |    *                     If null, then the current date is returned.
  |    */
  |   protected static Date getStartDate( String startTime )
  |   {
  |     // calculate the time when the timer should fire -- based on the specified startTime
  |     // if no startTime was specified, just use the current date
  |     if( startTime != null && startTime.length() > 0  )
  |       try
  |       {
  |         // load the HH:MM:SS AM/PM value from the process definition into a GregorianCalendar
  |         SimpleDateFormat sdf = new SimpleDateFormat( "H:m:s");
  |         GregorianCalendar startTimeCal = new GregorianCalendar();
  |         startTimeCal.setTime( sdf.parse( startTime ));
  |         
  |         // now copy the HH MM SS AN/PM fields into a today's date
  |         GregorianCalendar StartDateCal = new GregorianCalendar();
  |         StartDateCal.set( Calendar.HOUR_OF_DAY, startTimeCal.get( Calendar.HOUR_OF_DAY ));
  |         StartDateCal.set( Calendar.MINUTE, startTimeCal.get( Calendar.MINUTE ));
  |         StartDateCal.set( Calendar.SECOND, startTimeCal.get( Calendar.SECOND ));
  |   
  |         // and adjust into the future (24 hours later -- if the calculated start date has already passed
  |         while( StartDateCal.getTimeInMillis() < System.currentTimeMillis() )
  |           StartDateCal.add( Calendar.HOUR_OF_DAY, 24 );
  |         
  |         return StartDateCal.getTime();
  |       }
  |       catch( Exception e )
  |       {
  |         logger.error( "Could not calculate date for 1st firing of timer. startTime= " + startTime );
  |         logger.error( "Caught exception " + e, e );
  |       }
  |       
  |     return new Date();
  |   }
  | 
  |   public static class CreateCustomTimerAction implements ActionHandler
  |   {
  |     private static final long serialVersionUID = 1L;
  | 
  |     // These arguments get their values from the configuration in the processdefinition.
  |     // The values are injected directly by the engine.
  |     /** the name of the timer */
  |     String timerName;
  |     /** OPTIONAL - HH:MM:SS in 24 hour format when the timer should start every day */
  |     String startTime;
  |     /** OPTIONAL - when the timer should fire after the optional start time, or right now */
  |     String dueDate;
  |     /** OPTIONAL - the repeat interval for the timer */
  |     String repeat;
  |     /** The name of the transition to follow after the timer is fired */
  |     String transitionName;
  |     /** OPTIONAL -- name of the action to associate with the timer */
  |     String actionName;
  | 
  |     public void execute( ExecutionContext context ) throws Exception
  |     {
  |       logger.info( "@@@@@@@@@@@@@@@ processInstance=" + context.getProcessInstance().getId() + " entered wait state" );
  |       
  |       // if timer is already created, don't do anything
  |       if( timer != null )
  |         return;
  |       
  |       // context.getContextInstance().setVariable("message", message);
  |       logger.info( "@@@@@@@@@@@@@@@ Got the Create Custom Timer event... " 
  |           + " configured as: " 
  |           + " timer name=" + timerName
  |           + " start time=" + startTime
  |           + " duedate=" + dueDate
  |           + " repeat=" + repeat 
  |           + " transitionName=" + transitionName
  |           + " action name=" + actionName );
  | 
  |       Token token = context.getToken();
  | 
  |       timer = new Timer( context.getToken() );
  |       timer.setName( timerName );
  |       Duration duration = new Duration( dueDate );
  |       BusinessCalendar businessCalendar = new BusinessCalendar();
  |       Date dueDate = businessCalendar.add( getStartDate( startTime ), duration );
  |       timer.setDueDate( dueDate );
  |       timer.setRepeat( repeat );
  |       timer.setTransitionName( transitionName );
  |       timer.setAction( context.getProcessDefinition().getAction( actionName ));
  |       timer.setGraphElement( context.getEventSource() );
  |       timer.setTaskInstance( context.getTaskInstance() );
  | 
  |       // Since this timer is not defined by the process, we need to use the SchedulerService to schedule the timer
  |       SchedulerService schedulerService = (SchedulerService) Services.getCurrentService( Services.SERVICENAME_SCHEDULER );
  |       schedulerService.createTimer( timer );
  | 
  |       logger.info( "@@@@@@@@@@@@@@@  timer=" + timer );
  |     }
  |   }
  |   
  |   public static class FireTimerAction implements ActionHandler
  |   {
  |     private static final long serialVersionUID = 1L;
  | 
  |     public void execute(ExecutionContext context) throws Exception 
  |     {
  |       logger.info( "@@@@@@@@@@@@@@@ processInstance=" + context.getProcessInstance().getId() 
  |         + " counter=" + counter 
  |         + " currently at node=" + context.getToken().getNode().getFullyQualifiedName() );
  |     }
  |   }
  | 
  |   public static class RunMmsServiceAction implements ActionHandler
  |   {
  |     private static final long serialVersionUID = 1L;
  | 
  |     String serviceClass;
  |     Map    serviceArguments;
  |     
  |     public void execute(ExecutionContext context) throws Exception 
  |     {
  |       logger.info( "@@@@@@@@@@@@@@@ processInstance=" + context.getProcessInstance().getId() 
  |         + " counter=" + counter 
  |         + " currently at node=" + context.getToken().getNode().getFullyQualifiedName() );
  |       logger.info( "@@@@@@@@@@@@@@@ serviceClass=" + serviceClass  
  |         + " and serviceArguments=" + serviceArguments );
  | 
  | //      MmsService mmsService = BSOFactory.getMmsService( serviceClass );
  | //      
  | //      if( serviceArguments == null )
  | //        mmsService.execute();
  | //      else
  | //        mmsService.execute( serviceArguments );
  | //      
  | //      mmsService.close();
  |     }
  |   }
  | 
  | 
  |   public static class EndOrRepeatDecision implements DecisionHandler 
  |   {
  |     private static final long serialVersionUID = 1L;
  | 
  |     public String decide(ExecutionContext context) 
  |     {
  |       logger.info( "@@@@@@@@@@@@@@@ processInstance=" + context.getProcessInstance().getId() 
  |         + " counter="+ counter 
  |         + " currently at node=" + context.getToken().getNode().getFullyQualifiedName() );
  |       
  |       if( --counter > 0 )
  |       {
  |         logger.info( "@@@@@@@@@@@@@@@ decision advancing to repeat-transition" );
  |         return "repeat-transition";
  |       }
  |       else
  |       {
  |         ProcessInstance processInstance = context.getToken().getProcessInstance();
  |         ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
  |         contextInstance.setVariable( "request-end-process", new Integer(1));
  |         
  |         // Make sure the timer's don't get triggered again between now and when the process ends
  | //        logger.info( "@@@@@@@@@@@@@@@ cancelling timers for processInstance=" + processInstance.getId() );
  | //        SchedulerService schedulerService = (SchedulerService)Services.getCurrentService( Services.SERVICENAME_SCHEDULER );
  | //        schedulerService.cancelTimersByProcessInstance( context.getToken().getProcessInstance() );
  | 
  |         logger.info( "@@@@@@@@@@@@@@@ suspending timers for processInstance=" + processInstance.getId() );
  |         SchedulerService schedulerService = (SchedulerService)Services.getCurrentService( Services.SERVICENAME_SCHEDULER );
  |         schedulerService.suspendTimers( context.getToken() );
  | 
  |       
  |         // THE EXCEPTION IS THROWN AFTER RETURNING BELOW
  |         // WITH OR WITHOUT THE SCHEDULER CODE ABOVE
  |         logger.info( "@@@@@@@@@@@@@@@ decision advancing to end-transition" );
  |         return "end-transition";
  |       }
  |     }
  |   }
  | }
  | 

HERE IS THE STACK TRACE:


  | 20:30:10,546 [main] INFO  ProcessManager : @@@@@@@@@@@@@@@@@@@@@@@ waiting for process to end......
  | Hibernate: select tokenvaria0_.CONTEXTINSTANCE_ as CONTEXTI3_1_, tokenvaria0_.ID_ as ID1_1_, tokenvaria0_.TOKEN_ as TOKEN2_1_, tokenvaria0_.ID_ as ID1_24_0_, tokenvaria0_.TOKEN_ as TOKEN2_24_0_, tokenvaria0_.CONTEXTINSTANCE_ as CONTEXTI3_24_0_ from JBPM_TOKENVARIABLEMAP tokenvaria0_ where tokenvaria0_.CONTEXTINSTANCE_=?
  | 20:30:17,196 [JbpmScheduler] DEBUG VariableContainer : create variable 'request-end-process' in 'TokenVariableMap1c232a' with value '1'
  | 20:30:17,216 [JbpmScheduler] DEBUG Converters : adding converter 'D', 'org.jbpm.context.exe.converter.DoubleToStringConverter'
  | 20:30:17,226 [JbpmScheduler] DEBUG Converters : adding converter 'C', 'org.jbpm.context.exe.converter.CharacterToStringConverter'
  | 20:30:17,236 [JbpmScheduler] DEBUG Converters : adding converter 'B', 'org.jbpm.context.exe.converter.BooleanToStringConverter'
  | 20:30:17,276 [JbpmScheduler] DEBUG Converters : adding converter 'Y', 'org.jbpm.context.exe.converter.BytesToByteArrayConverter'
  | 20:30:17,276 [JbpmScheduler] DEBUG Converters : adding converter 'A', 'org.jbpm.context.exe.converter.DateToLongConverter'
  | 20:30:17,286 [JbpmScheduler] DEBUG Converters : adding converter 'R', 'org.jbpm.context.exe.converter.SerializableToByteArrayConverter'
  | 20:30:17,296 [JbpmScheduler] DEBUG Converters : adding converter 'I', 'org.jbpm.context.exe.converter.IntegerToLongConverter'
  | 20:30:17,296 [JbpmScheduler] DEBUG Converters : adding converter 'H', 'org.jbpm.context.exe.converter.ShortToLongConverter'
  | 20:30:17,306 [JbpmScheduler] DEBUG Converters : adding converter 'G', 'org.jbpm.context.exe.converter.FloatToDoubleConverter'
  | 20:30:17,306 [JbpmScheduler] DEBUG Converters : adding converter 'F', 'org.jbpm.context.exe.converter.FloatToStringConverter'
  | 20:30:17,316 [JbpmScheduler] DEBUG Converters : adding converter 'E', 'org.jbpm.context.exe.converter.ByteToLongConverter'
  | 20:30:17,336 [JbpmScheduler] INFO  ActionHandlers$EndOrRepeatDecision : @@@@@@@@@@@@@@@ suspending timers for processInstance=2
  | Hibernate: insert into JBPM_TOKENVARIABLEMAP (TOKEN_, CONTEXTINSTANCE_, ID_) values (?, ?, null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_VARIABLEINSTANCE (NAME_, CONVERTER_, TOKEN_, TOKENVARIABLEMAP_, PROCESSINSTANCE_, LONGVALUE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'L', null)
  | Hibernate: call identity()
  | Hibernate: update JBPM_TIMER set ISSUSPENDED_=1 where TOKEN_=?
  | 20:30:17,356 [JbpmScheduler] INFO  ActionHandlers$EndOrRepeatDecision : @@@@@@@@@@@@@@@ decision advancing to end-transition
  | 20:30:20,200 [JbpmScheduler] DEBUG Decision : selected transition name 'end-transition'
  | 20:30:20,200 [JbpmScheduler] DEBUG GraphElement : event 'node-leave' on 'Decision(Continue Or Shutdown)' for 'Token(/)'
  | 20:30:20,200 [JbpmScheduler] DEBUG GraphElement : event 'transition' on 'Transition(end-transition)' for 'Token(/)'
  | Hibernate: select events0_.TRANSITION_ as TRANSITION7_1_, events0_.ID_ as ID1_1_, events0_.EVENTTYPE_ as EVENTTYPE2_1_, events0_.ID_ as ID1_7_0_, events0_.EVENTTYPE_ as EVENTTYPE2_7_0_, events0_.TYPE_ as TYPE3_7_0_, events0_.GRAPHELEMENT_ as GRAPHELE4_7_0_ from JBPM_EVENT events0_ where events0_.TRANSITION_=?
  | Hibernate: select node0_.ID_ as ID1_5_0_, node0_.NAME_ as NAME3_5_0_, node0_.PROCESSDEFINITION_ as PROCESSD4_5_0_, node0_.ISASYNC_ as ISASYNC5_5_0_, node0_.ACTION_ as ACTION6_5_0_, node0_.SUPERSTATE_ as SUPERSTATE7_5_0_, node0_.SUBPROCESSDEFINITION_ as SUBPROCE8_5_0_, node0_.DECISIONEXPRESSION_ as DECISION9_5_0_, node0_.DECISIONDELEGATION as DECISIO10_5_0_, node0_.SIGNAL_ as SIGNAL11_5_0_, node0_.CREATETASKS_ as CREATET12_5_0_, node0_.ENDTASKS_ as ENDTASKS13_5_0_, node0_.CLASS_ as CLASS2_5_0_ from JBPM_NODE node0_ where node0_.ID_=?
  | 20:30:20,210 [JbpmScheduler] DEBUG GraphElement : event 'node-enter' on 'EndState(end1)' for 'Token(/)'
  | Hibernate: select events0_.NODE_ as NODE6_1_, events0_.ID_ as ID1_1_, events0_.EVENTTYPE_ as EVENTTYPE2_1_, events0_.ID_ as ID1_7_0_, events0_.EVENTTYPE_ as EVENTTYPE2_7_0_, events0_.TYPE_ as TYPE3_7_0_, events0_.GRAPHELEMENT_ as GRAPHELE4_7_0_ from JBPM_EVENT events0_ where events0_.NODE_=?
  | Hibernate: select children0_.PARENT_ as PARENT13_1_, children0_.ID_ as ID1_1_, children0_.NAME_ as NAME3_1_, children0_.ID_ as ID1_21_0_, children0_.VERSION_ as VERSION2_21_0_, children0_.NAME_ as NAME3_21_0_, children0_.START_ as START4_21_0_, children0_.END_ as END5_21_0_, children0_.NODEENTER_ as NODEENTER6_21_0_, children0_.NEXTLOGINDEX_ as NEXTLOGI7_21_0_, children0_.ISABLETOREACTIVATEPARENT_ as ISABLETO8_21_0_, children0_.ISTERMINATIONIMPLICIT_ as ISTERMIN9_21_0_, children0_.ISSUSPENDED_ as ISSUSPE10_21_0_, children0_.NODE_ as NODE11_21_0_, children0_.PROCESSINSTANCE_ as PROCESS12_21_0_, children0_.PARENT_ as PARENT13_21_0_, children0_.SUBPROCESSINSTANCE_ as SUBPROC14_21_0_ from JBPM_TOKEN children0_ where children0_.PARENT_=?
  | Hibernate: select children0_.PARENT_ as PARENT13_1_, children0_.ID_ as ID1_1_, children0_.NAME_ as NAME3_1_, children0_.ID_ as ID1_21_0_, children0_.VERSION_ as VERSION2_21_0_, children0_.NAME_ as NAME3_21_0_, children0_.START_ as START4_21_0_, children0_.END_ as END5_21_0_, children0_.NODEENTER_ as NODEENTER6_21_0_, children0_.NEXTLOGINDEX_ as NEXTLOGI7_21_0_, children0_.ISABLETOREACTIVATEPARENT_ as ISABLETO8_21_0_, children0_.ISTERMINATIONIMPLICIT_ as ISTERMIN9_21_0_, children0_.ISSUSPENDED_ as ISSUSPE10_21_0_, children0_.NODE_ as NODE11_21_0_, children0_.PROCESSINSTANCE_ as PROCESS12_21_0_, children0_.PARENT_ as PARENT13_21_0_, children0_.SUBPROCESSINSTANCE_ as SUBPROC14_21_0_ from JBPM_TOKEN children0_ where children0_.PARENT_=?
  | Hibernate: select children0_.PARENT_ as PARENT13_1_, children0_.ID_ as ID1_1_, children0_.NAME_ as NAME3_1_, children0_.ID_ as ID1_21_0_, children0_.VERSION_ as VERSION2_21_0_, children0_.NAME_ as NAME3_21_0_, children0_.START_ as START4_21_0_, children0_.END_ as END5_21_0_, children0_.NODEENTER_ as NODEENTER6_21_0_, children0_.NEXTLOGINDEX_ as NEXTLOGI7_21_0_, children0_.ISABLETOREACTIVATEPARENT_ as ISABLETO8_21_0_, children0_.ISTERMINATIONIMPLICIT_ as ISTERMIN9_21_0_, children0_.ISSUSPENDED_ as ISSUSPE10_21_0_, children0_.NODE_ as NODE11_21_0_, children0_.PROCESSINSTANCE_ as PROCESS12_21_0_, children0_.PARENT_ as PARENT13_21_0_, children0_.SUBPROCESSINSTANCE_ as SUBPROC14_21_0_ from JBPM_TOKEN children0_ where children0_.PARENT_=?
  | Hibernate: select children0_.PARENT_ as PARENT13_1_, children0_.ID_ as ID1_1_, children0_.NAME_ as NAME3_1_, children0_.ID_ as ID1_21_0_, children0_.VERSION_ as VERSION2_21_0_, children0_.NAME_ as NAME3_21_0_, children0_.START_ as START4_21_0_, children0_.END_ as END5_21_0_, children0_.NODEENTER_ as NODEENTER6_21_0_, children0_.NEXTLOGINDEX_ as NEXTLOGI7_21_0_, children0_.ISABLETOREACTIVATEPARENT_ as ISABLETO8_21_0_, children0_.ISTERMINATIONIMPLICIT_ as ISTERMIN9_21_0_, children0_.ISSUSPENDED_ as ISSUSPE10_21_0_, children0_.NODE_ as NODE11_21_0_, children0_.PROCESSINSTANCE_ as PROCESS12_21_0_, children0_.PARENT_ as PARENT13_21_0_, children0_.SUBPROCESSINSTANCE_ as SUBPROC14_21_0_ from JBPM_TOKEN children0_ where children0_.PARENT_=?
  | 20:30:20,220 [JbpmScheduler] DEBUG GraphElement : event 'process-end' on 'ProcessDefinition(Load Confirm Data Process)' for 'Token(/)'
  | Hibernate: delete from JBPM_TIMER where PROCESSINSTANCE_=?
  | 20:30:20,240 [JbpmScheduler] DEBUG GraphElement : event 'after-signal' on 'State(Wait For Start Time)' for 'Token(/)'
  | 20:30:20,240 [JbpmScheduler] DEBUG Services : executing default save operations
  | 20:30:20,250 [JbpmScheduler] DEBUG HibernateSaveOperation : saving process instance
  | 20:30:20,250 [JbpmScheduler] DEBUG SaveLogsOperation : flushing logs to logging service.
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'S', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, EXCEPTION_, ACTION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'A', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'O', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'O', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, EXCEPTION_, ACTION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'A', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, EXCEPTION_, ACTION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'A', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, EXCEPTION_, ACTION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'A', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, Eorg.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:171)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.executeTimers(SchedulerThread.java:161)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.run(SchedulerThread.java:70)
  | Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)NTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, EXCEPTION_, ACTION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'A', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, EXCEPTION_, ACTION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, 'A', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, VARIABLEINSTANCE_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'R', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, VARIABLEINSTANCE_, OLDLONGVALUE_, NEWLONGVALUE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'G', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, NODE_, ENTER_, LEAVE_, DURATION_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, ?, 'N', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, TRANSITION_, SOURCENODE_, DESTINATIONNODE_, CLASS_, ID_) values (?, ?, ?, ?, ?, ?, ?, 'T', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'Y', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'Y', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'Y', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'Y', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'Y', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CHILD_, CLASS_, ID_) values (?, ?, ?, ?, ?, 'Y', null)
  | Hibernate: call identity()
  | Hibernate: insert into JBPM_LOG (INDEX_, DATE_, TOKEN_, PARENT_, CLASS_, ID_) values (?, ?, ?, ?, 'X', null)
  | Hibernate: call identity()
  | 20:30:20,290 [JbpmScheduler] DEBUG CascadeSaveOperation : cascading save of 'org.jbpm.graph.exe.ProcessInstance at 1ffdf86'
  | 20:30:20,290 [JbpmScheduler] DEBUG SchedulerThread : saving updated timer for repetition 'timer(start-confirm-automated-tasks,20:30:48,979)' in '28689' millis
  | 20:30:20,290 [JbpmScheduler] DEBUG JbpmContext : closing JbpmContext
  | 20:30:20,290 [JbpmScheduler] DEBUG Services : closing service 'persistence': org.jbpm.persistence.db.DbPersistenceService at 13552ed
  | 20:30:20,300 [JbpmScheduler] DEBUG DbPersistenceService : committing hibernate transaction
  | Hibernate: update JBPM_TIMER set NAME_=?, DUEDATE_=?, REPEAT_=?, TRANSITIONNAME_=?, EXCEPTION_=?, ISSUSPENDED_=?, ACTION_=?, TOKEN_=?, PROCESSINSTANCE_=?, TASKINSTANCE_=?, GRAPHELEMENTTYPE_=?, GRAPHELEMENT_=? where ID_=?
  | 20:30:20,310 [JbpmScheduler] ERROR BatchingBatcher : Exception executing batch: 
  | org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
  | 	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
  | 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:91)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2166)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
  | 	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
  | 	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.executeTimers(SchedulerThread.java:161)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.run(SchedulerThread.java:70)
  | 20:30:20,330 [JbpmScheduler] ERROR AbstractFlushingEventListener : Could not synchronize database state with session
  | org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
  | 	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
  | 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:91)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2166)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
  | 	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
  | 	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.executeTimers(SchedulerThread.java:161)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.run(SchedulerThread.java:70)
  | 
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
  | 	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
  | 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:91)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2166)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
  | 	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
  | 	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	... 4 more
  | 20:30:20,380 [JbpmScheduler] ERROR Services : problem closing service 'persistence'
  | org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:171)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.executeTimers(SchedulerThread.java:161)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.run(SchedulerThread.java:70)
  | Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
  | 	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
  | 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:91)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2166)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
  | 	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
  | 	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	... 4 more
  | 20:30:20,390 [JbpmScheduler] DEBUG Services : closing service 'scheduler': org.jbpm.scheduler.db.DbSchedulerService at 18aea9e
  | 20:30:20,390 [JbpmScheduler] DEBUG Services : closing service 'logging': org.jbpm.logging.db.DbLoggingService at 182f3da
  | 20:30:20,390 [JbpmScheduler] INFO  SchedulerThread : runtime exception while executing timers
  | org.jbpm.JbpmException: problem closing services {persistence=org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session}
  | 	at org.jbpm.svc.Services.close(Services.java:223)
  | 	at org.jbpm.JbpmContext.close(JbpmContext.java:141)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.executeTimers(SchedulerThread.java:161)
  | 	at org.jbpm.scheduler.impl.SchedulerThread.run(SchedulerThread.java:70)
  | Caused by: org.jbpm.persistence.JbpmPersistenceException: couldn't commit hibernate session
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:171)
  | 	at org.jbpm.svc.Services.close(Services.java:211)
  | 	... 3 more
  | Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
  | 	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
  | 	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
  | 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:91)
  | 	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:86)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2166)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
  | 	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
  | 	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
  | 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
  | 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
  | 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
  | 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
  | 	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
  | 	at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:161)
  | 	... 4 more
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3978424#3978424

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3978424



More information about the jboss-user mailing list