Failure when ending process
jrojas_pb Oct 15, 2006 9:01 PMHi,
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@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@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@18aea9e
20:30:20,390 [JbpmScheduler] DEBUG Services : closing service 'logging': org.jbpm.logging.db.DbLoggingService@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