cancel
Showing results for 
Search instead for 
Did you mean: 

Very Simple Process with Timer Start Event throws Exception

ct1
Champ in-the-making
Champ in-the-making
I am seeing the OptimisticLockingException that plagues my use of timers and boundary events.

While trying to use a timer start event, I am getting the OptimisticLockingException.

With this very simple process, I am just trying to start the process at a specified time and log via a script task that it started.  I had no other Process Engines running (although .war files that contain applications that create Process Engines were on the classpath).  I have read and reread the User's Guide and the Activiti In Action sections describing the timers, but still am unable to make even a simple one to work without throwing an exception.

I am running Activiti 5.9, Microsoft SQL Server 2008 R2, jtds-1.2.5, Apache Tomcat 7.0.27 on Windows 7

Would you please have time to point out what I am doing incorrectly?  I am having similar problems using boundary timer events, but I think that if I can get this simple process to work, I might be able to get the boundary timer events to work also.

Here is the BPMN file:


<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="timeStartProc01" name="Timer Start Proc 01">
    <startEvent id="timerProc01Start" name="Timer Proc01 Start ">
[b]      <timerEventDefinition>
        <timeDate>2012-06-28T12:01:00</timeDate>
      </timerEventDefinition>[/b]
    </startEvent>
    <scriptTask id="scripttask1" name="Script Task" scriptFormat="groovy">
      <script><![CDATA[Date timerStarted = new Date();
String timerStartedStr = timerStarted.format('yyyy/MM/dd HH:mm:ss SSS');
print "Timer-Start-Proc 01 logged at $timerStartedStr \n";]]></script>
    </scriptTask>
    <endEvent id="timerStartProc01End" name="tTmer Start Proc01 End"></endEvent>
    <sequenceFlow id="flow1" name="" sourceRef="timerProc01Start" targetRef="scripttask1"></sequenceFlow>
    <sequenceFlow id="flow2" name="" sourceRef="scripttask1" targetRef="timerStartProc01End"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_timeStartProc01">
    <bpmndi:BPMNPlane bpmnElement="timeStartProc01" id="BPMNPlane_timeStartProc01">
      <bpmndi:BPMNShape bpmnElement="timerProc01Start" id="BPMNShape_timerProc01Start">
        <omgdc:Bounds height="35" width="35" x="110" y="230"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="scripttask1" id="BPMNShape_scripttask1">
        <omgdc:Bounds height="55" width="105" x="220" y="220"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="timerStartProc01End" id="BPMNShape_timerStartProc01End">
        <omgdc:Bounds height="35" width="35" x="390" y="230"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="145" y="247"></omgdi:waypoint>
        <omgdi:waypoint x="220" y="247"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="325" y="247"></omgdi:waypoint>
        <omgdi:waypoint x="390" y="247"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>


And, this is the activiti.cfg.xml


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
 
    <!– Database configurations –>
    <property name="databaseSchemaUpdate" value="true" />
   
   <property name="databaseType" value="mssql" />
   
    <property name="jdbcUrl" value="jdbc:jtds:sqlserver://lusr1315:1433/Activiti_DB" />
    <property name="jdbcDriver" value="net.sourceforge.jtds.jdbc.Driver" />
    <property name="jdbcUsername" value="xxxxxxxxxxx" />
    <property name="jdbcPassword" value="yyyyyyyyyyyy" />
   
    <property name="jobExecutorActivate" value="true" />
   
   <property name="mailServerHost" value="localhost" />
   <property name="mailServerPort" value="25" />

  </bean>

</beans>

And this is the exception I get at the time the timer start event should begin:


Jun 28, 2012 12:01:00 PM org.activiti.engine.impl.interceptor.CommandContext close
SEVERE: Error while closing command context
org.activiti.engine.ActivitiOptimisticLockingException: TimerEntity[959818] was updated by another t
ransaction concurrently
        at org.activiti.engine.impl.db.DbSqlSession.flushUpdates(DbSqlSession.java:452)
        at org.activiti.engine.impl.db.DbSqlSession.flush(DbSqlSession.java:348)
        at org.activiti.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:149
)
        at org.activiti.engine.impl.interceptor.CommandContext.close(CommandContext.java:105)
        at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInte
rceptor.java:49)
        at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33)
        at org.activiti.engine.impl.jobexecutor.AcquireJobsRunnable.run(AcquireJobsRunnable.java:57)

        at java.lang.Thread.run(Thread.java:662)

Thank you.
10 REPLIES 10

frederikherema1
Star Contributor
Star Contributor
THis is a reasonable approach for avoiding concurrency-exceptions on job-executors. However, enabling them all is fine as well, if you processes don do non-transactional stuff. If they do, they get rolled back cleanly and it seems like the second job executor never executed (only proof is execution-stacktrace).

Offcourse, if that one machine goes down, no jobs will be executed. I'm afraid you'll have to come up with a custom solution for this, activiti has nothing built-in for this.