当前位置: 首页 > 知识库问答 >
问题:

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

叶裕
2023-03-14

我正在设计一个指导决策表来执行一些工作项,这些工作项只是在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个答案

燕朝明
2023-03-14

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

希望能有所帮助,

 类似资料:
  • 我有一个Drools决策表(见下文),其中规则2有一个条件,检查营养分数是否在某个阈值之间,并根据该条件执行操作。有一个初始规则(规则1)执行检查并执行其操作,它更新了我希望规则2在执行其条件时使用的总分。 我的期望/需要: 规则1运行,如果条件满足,则更新$model上的总体分数(通过执行其操作),然后规则2运行,并且对于它的条件,使用由规则1的操作运行更新的更新分数值。 实际发生了什么 规则1

  • 本文向大家介绍解决vue项目中type=”file“ change事件只执行一次的问题,包括了解决vue项目中type=”file“ change事件只执行一次的问题的使用技巧和注意事项,需要的朋友参考一下 问题描述 在最近的项目开发中遇到了这样的一个问题,当我上传了一个文件时,我将获取到的文件名清空后,却无法再次上传相同的文件 因为我只是将data中的属性值清空而已,文件名没有变当然会不出发ch

  • 我们在决策表中实现了一个场景,如果某个规则成功地执行了规则的操作部分,就可以退出其余规则的执行。假设我有50条规则,第5条规则表示保险索赔无效,那么我们将索赔设置为对象无效,那么就不需要执行其余的规则。如何才能做到这一点。请建议

  • 问题内容: 我想通过cron运行一项工作,该工作将在一天中的指定时间每隔第二个星期二执行一次。每个星期二都很容易: 但是,如何在“每隔第二个星期二”(或者,如果您愿意,每隔第二周)进行一次?我不想自己在脚本中实现任何逻辑,而是仅将定义保留在cron中。 问题答案: 怎么样呢,即使没有在前五个字段中完全定义它,它也会保留它: