Camunda / Activiti进程在JavaDelegate中非常有用

时间:2017-06-01 15:20:04

标签: infinite-loop activiti camunda

我的camunda进程有问题,看起来像this。 此过程在步骤SetId和CreateObjectsForId(都是JavaDelegates)中以非确定性方式无休止地循环。

我正在使用camunda 7.5。

我有一些BaseJavaDelegate实现如下:

@Override
public void execute( DelegateExecution aExecution ) throws Exception
{
    logBefore( aExecution );
    try
    {
        executeInTry( aExecution );
    }
    catch( Throwable aEx )
    {
        aEx.printStackTrace();
        throw new BpmnError( "GENERIC_ERROR_CODE", aEx.getMessage() );
    }
   logAfter( aExecution );
}

从示例执行中记录:

01.06.2017 15:32:53,902;pool-6-thread-2:...wf.base.BaseJavaDelegate;callExecuteInTry;DEBUG;
Starting task:
    ProcessDefinitionId: ...Process1:1:1
    ProcessInstanceId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ExecutionId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ActivityId: SetId
    TransactionId: null 
...
01.06.2017 15:32:54,664;pool-6-thread-2:...wf.base.BaseJavaDelegate;callExecuteInTry;DEBUG;
Ended task: 
    ProcessDefinitionId: ...Process1:1:1
    ProcessInstanceId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ExecutionId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ActivityId: SetId
    TransactionId: null
...
Starting task:
    ProcessDefinitionId: ...Process1:1:1
    ProcessInstanceId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ExecutionId: d161958b-46ce-11e7-8483-005056b37c6b
    ActivityId: CreateObjectsForId
    TransactionId: null
...
01.06.2017 15:37:53,886;pool-6-thread-3:...wf.base.BaseJavaDelegate;callExecuteInTry;DEBUG;
Starting task:
    ProcessDefinitionId: ...Process1:1:1
    ProcessInstanceId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ExecutionId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ActivityId: SetId
    TransactionId: null 
...
01.06.2017 15:37:53,893;pool-6-thread-3:...wf.base.BaseJavaDelegate;callExecuteInTry;DEBUG;
Ended task: 
    ProcessDefinitionId: ...Process1:1:1
    ProcessInstanceId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ExecutionId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ActivityId: SetId
    TransactionId: null 
...
Starting task:
    ProcessDefinitionId: ...Process1:1:1
    ProcessInstanceId: ae2ecf43-46ce-11e7-8483-005056b37c6b
    ExecutionId: d161958b-46ce-11e7-8483-005056b37c6b
    ActivityId: CreateObjectsForId
    TransactionId: null 

从日志中可以看到SetId第二次启动,而CreateObjectsForId从未完成。 执行期间不会抛出异常。 前面的步骤也都在同一个线程中执行,但是当循环开始时,进程开始使用另一个线程/两个线程。

我试图通过设计像this这样的流程来绕过这个问题。 这次SetId步骤的实现知道它是第二次进入,并且独占门进程应该更进一步。

不幸的是,这个过程仍然循环!我的代码也不例外。没有OptimisticLockException。 camunda没有任何其他例外。 我不知道还有什么可以导致进程像这样循环。

2 个答案:

答案 0 :(得分:0)

也许我错过了什么,但看起来你在这里有递归代码。 您的委托执行,然后执行并在executeInTry()中再次执行....冲洗并重复。

我错过了什么吗? 格雷格

答案 1 :(得分:0)

我找到了解决问题的方法。 我一直在运行嵌入式camunda引擎。

有一次,我决定尝试在应用服务器上运行相同的代码(在我的情况下是wildfly)。现在我在日志中得到了明确的消息,我的交易我们花了太长时间。 Here您可以找到此问题的解决方案(事务超时和作业执行程序lockTimeInMillis)