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

StatelessKie会话不返回插入的对象

司空瑾瑜
2023-03-14

我想使用Drools规则进行一些验证:

rule "Test"
    when
        MyRequest(paymentTerm == PaymentTerm.MONTH);
    then
        Validation val = new Validation();
        val.setIsValid(true);
        val.setDescription("It's a monthly term!");
        insert(val);
end

我第一次创建了一个Statefull-KieSession,它第一次按预期工作。然而,当我重新运行该规则时,验证事实仍在内存中,这不是我想要的。因此,我尝试将示例调整为无状态KieSession。

使用KieSession K会话:

    kSession.insert(req);
    kSession.fireAllRules();
    Collection<?> validations = kSession.getObjects(new ClassObjectFilter(Validation.class));

使用无状态KieSession会话:

    List<Command> cmds = new ArrayList<>();
    cmds.add(CommandFactory.newInsert(req, "request"));
    cmds.add(CommandFactory.newGetObjects(new ClassObjectFilter(Validation.class), "validations"));
    ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(cmds));
    Collection<?> validations = (Collection<?>) results.getValue("validations");

statefull会话在validations集合中返回一个Validation对象,无状态KieSession返回一个空集合。为什么?

KIE/Drools:6.5.0。最终的

JavaEE 7,在WildFly 10.1.0上使用CDI

共有1个答案

石喜
2023-03-14

找到了。我需要显式指定运行fireAllRules命令时的顺序。这项工作:

    List<Command> cmds = new ArrayList<>();
    cmds.add(CommandFactory.newInsert(req, "request"));
    cmds.add(CommandFactory.newFireAllRules());
    cmds.add(CommandFactory.newGetObjects(new ClassObjectFilter(Validation.class), "validations"));
    ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(cmds));
    Collection<?> validations = (Collection<?>) results.getValue("validations");
 类似资料:
  • 我正在从WLS10g和JavaEE6升级到WLS12c和JavaEE7。 我注意到的工作方式不同。在WLS10中,任何已经存储在某个键下的对象都将始终被替换。 在WLS12中,如果新建对象,则不会替换该对象。等于(旧对象)。 这对我们来说是个问题,因为应用程序有如下对象: ValueObject通过跨多个网页的工作流进行修改。中间值存储在中,并在工作流结束时将修改后的值写入数据库。 在servle

  • 我有一个查询和一张表。查询“EmployeeTraining”包括员工姓名、参加的培训课程、参加的日期和有效期。我希望LeftJoin返回的是所有可用的培训课程,以及每个员工缺少的课程,因此在essense中,任何空值都是空的。 “应用培训”共有5项记录。一些员工只参加了4/5的课程,在“员工培训”记录中只有4项记录。left join不应该在“DateTake”和“Expiration”中使用空

  • 我将数据保存到会话中,但是我尝试将其读回,结果为空。Spring MVC是我的后端,Angular 4是前端。 爪哇: 角: 你知道我错过了什么吗?也许是CORS的事?

  • 我正在iOS上构建一个小应用程序,使用Spotify SDK向其Web Api发出请求。问题是,我正在使用函数每当我想提出请求时,都可以续订令牌。但是对于该函数,文档中说“如果没有指定令牌刷新服务,回调将返回nil作为会话”。这就是发生在我身上的事。我总是得到一个零“续费期”(https://developer.spotify.com/ios-sdk-docs/Documents/Classes/

  • 问题内容: 我试图比较两个相同类型的对象(在dosHave方法中),但是我从未返回过“ true”。这是我的代码: “ Osoba”类如下所示: 来自主代码: 无论我要使用什么输入,这部分都永远不会发生。“ kartoteka”是我当然进口的包裹。每个类都在单独的程序包中,但是使用它们没有问题。我已经尝试了一段时间,但没有任何帮助,似乎 从来都不是真的,但我不知道为什么。没有Boolean.TRU

  • 我有一个回调函数,检查我的登录详细信息是否正确-如果他们是错误的,它返回一个错误(这是工作正常)。如果细节是正确的,它应该设置会话