JBPM 工作项中的引导决策 table 只执行一次?

JBPM work items in guided decision table only executed once?

我正在设计一个指导决策 table 来执行一些工作项,这些工作项只是在 executeWorkItem 函数中打印出一些文本。

在 workbench 设置中,我已将工作项处理程序添加到有状态会话中。我也在一个 wid 文件中定义了它们。

指导决策 table 中的规则非常简单。源码查看如下

//from row number: 1
rule "Row 1 dt1"
    dialect "mvel"
    when
    then
        org.drools.core.process.instance.WorkItemManager wim = (org.drools.core.process.instance.WorkItemManager) drools.getWorkingMemory().getWorkItemManager();
        org.drools.core.process.instance.impl.WorkItemImpl wiQianhaiAddrWorkItemHandler = new org.drools.core.process.instance.impl.WorkItemImpl();
        wiQianhaiAddrWorkItemHandler.setName( "QianhaiAddrWorkItemHandler" );
        wim.internalExecuteWorkItem( wiQianhaiAddrWorkItemHandler );
end

没有条件检查只是因为我想在每次有请求发送到 KIE 服务器时触发它。

这是向 KIE 服务器发出的请求

URL:http://localhost:8080/kie-server/services/rest/server/containers/instances/poc2_1.0.1
body:
{"commands": [
  {
    "fire-all-rules": {}
  }
]}

我可以看到工作项是在第一次向 KIE 服务器发出请求时执行的。但是,自从第二次以来它不再 运行 因为我在控制台中看不到任何打印。

KIE 服务器的响应总是正确的,如下所示

{
  "type" : "SUCCESS",
  "msg" : "Container poc2_1.0.1 successfully called.",
  "result" : {
    "execution-results" : {
      "results" : [ ],
      "facts" : [ ]
    }
  }
}

我可以知道如何根据我发送的 "fire-all-rules" 命令执行工作项吗?还是 JBPM 中的默认行为?

让我们首先说明,即使您使用的是 WorkItemManager,您的问题也完全与 Drools 相关。

在 Drools 中,没有条件的规则只会在您或某人第一次调用 fireAllRules() 时在每个会话中执行一次。在您的情况下,因为您的请求正在重用同一个有状态会话,所以您的规则将被执行一次。

第一种方法是尽可能使用无状态会话。如果那不可能,您可能需要在处理新请求时明确告诉 Drools,方法是随请求一起发送事实并将其添加到您的规则条件中。如果您在会话中不需要这些事实,您可以稍后删除它们:

rule "Row 1 dt1"
dialect "mvel"
when
    Request()
then
    org.drools.core.process.instance.WorkItemManager wim = (org.drools.core.process.instance.WorkItemManager) drools.getWorkingMemory().getWorkItemManager();
    org.drools.core.process.instance.impl.WorkItemImpl wiQianhaiAddrWorkItemHandler = new org.drools.core.process.instance.impl.WorkItemImpl();
    wiQianhaiAddrWorkItemHandler.setName( "QianhaiAddrWorkItemHandler" );
    wim.internalExecuteWorkItem( wiQianhaiAddrWorkItemHandler );
end


rule "Cleanup Request"
salience -10
when
    $r: Request()
then
    delete($r);
end

希望对您有所帮助,