指导决策表中的JBPM工作项仅执行一次?

时间:2019-01-30 09:49:59

标签: drools jbpm

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

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

指导决策表中的规则非常简单。在源代码视图中如下所示

//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中的默认行为?

1 个答案:

答案 0 :(得分:1)

让我们首先说,即使您使用的是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

希望有帮助,