Jbpm。异步工作项和重试

时间:2015-02-25 07:32:56

标签: java drools jbpm bpmn

让我直接来看看用例。

我的流程中有很多工作项目说A,B,C。它以A--->B--->C顺序开始。

就我而言,B是对3rd party网络服务的调用。仅当C成功时才应处理B。如果对Web服务的调用失败,系统应在5 min之后重试。重试次数限制为3

如何使用Jbpm6实现此目的。?

我从doc中理解的一些选项是,

1)我可以使用工作项处理程序。在工作项内部,我将启动另一个将执行重试的线程,最后调用completeWrokItem()方法。但在这种情况下,我的进程引擎线程将不必要地等待completeWrokItem()调用。 2)我可以使用command进行重试。但是如果我调用command它将在另一个线程中执行,并且进程线程将执行C。这不是一种理想的方式

如何创建流程,以便B将在后端执行并通知引擎它可以继续执行C

请建议。

提前致谢。

如果我的问题不够明确,请发表评论。

2 个答案:

答案 0 :(得分:1)

你的问题并不完全清楚;但是,我提供了一个答案,希望能提供一些清晰度:

  1. 对于异步执行,您应遵循文档中的指南:JBMP 6.0 Async Documentation

  2. 鉴于您的流程流程,如果您使用Command和定义为的流程:A-> B-> C;在命令完成之前,C不会启动。

  3. 要让命令并行运行,可以使用并行分支。在下面的图片中,如果Script1和Script2是命令,它们将并行执行,而Email只会在两个脚本完成时执行: Parallel Exectuion

  4. 通过简单地从执行方法返回命令信号完成:

    public ExecutionResults execute(CommandContext ctx) throws Exception   {
    
      // Set results if exist. Otherwise, return empty ExecutionResults.
      ExecutionResults results = new ExecutionResults();
    
      // This would match the name of an output parameter for the work item.
      // results.setData("result", "result data");
    
      logger.info("Command finished execution: " + this.getClass());
      logger.debug("Results of executing command: ", results);
      return results;
    }
    

    `

答案 1 :(得分:0)

在节点B之后添加XOR网关,向节点B添加脚本并设置Web服务的状态和retry_count(如果成功,则status_b = true;如果失败,则status_b = false和retry_count ++),< / p>

如果retry_count> = 3或status_b == true,则X转到C 否则再去B