Trigger Activiti工作流,用于在ReceiveTask循环中进行任务

时间:2013-03-26 15:06:26

标签: java alfresco activiti

我有一个Activiti工作流程,其中包含一个ReceiveTask,我将任务分组。我有一个Listener,它在ReceiveTask的事件开始时触发,我在其中检查新添加的任务的属性,以查看具有相同属性的其他人是否在ReceiveTask中。如果是,那么我想触发它​​们全部进入下一步。

<receiveTask id="IssuePost" name="Issue Post">
  <extensionElements>
    <activiti:executionListener event="start" delegateExpression="${IssuePost}"></activiti:executionListener>
  </extensionElements>
</receiveTask>

My Java Listener类在任务移动到ReceiveTask时,会调用IssuePost。我可以在ReceiveTask中找到其他任务的列表。我在触发任务以转移到工作流程的下一步时遇到问题。当我在任务上调用“信号”时,我陷入了一个循环中。 IssuePost监听器继续在无限循环中被触发,直到Alfresco / Activiti放弃并抛出异常。

List<NodeRef> siblingNodes = searchService.selectNodes( parent, xpath, null, namespacePrefixResolver, false );
if( siblingNodes.size() == batchCount )
{
    for( int i=0; i < siblingNodes.size(); i++ )
    {
        List<WorkflowInstance> workflows = workflowService.getWorkflowsForContent( siblingNodes.get( i ), true );
        // this line causes the loop.
        workflowService.signal( workflows.get(0).getId(), null );

如何在ReceiveTask中发出任务信号,以便在不触发我的监听器的情况下转移到工作流程的下一步?接收任务只有一个流出工作流程的下一步。

1 个答案:

答案 0 :(得分:1)

查看 InvitationServiceImpl ,我看到以下有用的代码段:

    List<WorkflowTask> tasks = workflowService.getTasksForWorkflowPath(startTask.getPath().getId());
    if(tasks.size()==1)
    {
        WorkflowTask task = tasks.get(0);
        if(taskTypeMatches(task, taskTypes))
        {
            if(properties != null)
            {
                workflowService.updateTask(task.getId(), properties, null, null);
            }
            workflowService.endTask(task.getId(), transition);
            return;
        }
    }

因此,您需要让任务本身更新或结束甚至开始。

或许在您的情况下,查找启动后的下一个转换并发出一个而不是null的信号。