让我直接来看看用例。
我的流程中有很多工作项目说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
?
请建议。
提前致谢。
如果我的问题不够明确,请发表评论。
答案 0 :(得分:1)
你的问题并不完全清楚;但是,我提供了一个答案,希望能提供一些清晰度:
对于异步执行,您应遵循文档中的指南:JBMP 6.0 Async Documentation
鉴于您的流程流程,如果您使用Command和定义为的流程:A-> B-> C;在命令完成之前,C不会启动。
要让命令并行运行,可以使用并行分支。在下面的图片中,如果Script1和Script2是命令,它们将并行执行,而Email只会在两个脚本完成时执行:
通过简单地从执行方法返回命令信号完成:
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