Drools有状态会话如何不存储fact响应仅保留global全局变量值
Drools有状态会话仅保留全局变量不存储Facts的实现方案
核心逻辑说明
Drools有状态会话的全局变量(global)存储在独立于工作内存(Working Memory)的上下文空间中,删除工作内存中的所有Fact对象不会对已设置的全局变量产生任何影响,完全匹配你的需求。
具体实现方案
方案1:手动清理工作内存Fact
每次请求处理完成后,遍历并删除当前会话工作内存中所有的Fact对象即可,示例代码如下:
// 规则执行完成后运行清理逻辑 Collection<? extends Object> allFacts = ksession.getObjects(); for (Object fact : allFacts) { ksession.delete(ksession.getFactHandle(fact)); }
方案2:通过Kie Server批量命令自动清理
如果通过Kie Server客户端调用服务,直接在批量执行命令中追加删除所有Fact的命令即可,无需手动维护Fact列表,示例代码如下:
// 构造执行命令集合 List<Command> commandList = new ArrayList<>(); // 插入本次请求的校验Fact commandList.add(CommandFactory.newInsert(yourCheckFact)); // 执行所有规则 commandList.add(CommandFactory.newFireAllRules()); // 删除工作内存中所有Fact,不会影响全局变量 commandList.add(CommandFactory.newDeleteObjects("*")); BatchExecutionCommand batchCommand = CommandFactory.newBatchExecution(commandList); // 调用Kie Server执行 ServiceResponse<ExecutionResults> response = kieServerClient.executeContainer(yourContainerId, batchCommand);
注意事项
- 不要调用
ksession.dispose()方法销毁会话,否则会话中存储的大体积全局变量也会被清除,需要重新传输设置。 - 引导式决策表的规则逻辑不需要做任何调整,清理逻辑对规则业务无侵入。
- 若全局变量是可变对象,规则运行中对全局变量的修改会自动在会话中持久化,无需额外赋值操作。
内容的提问来源于stack exchange,提问作者Jairo
相关产品推荐
相关产品推荐

