Drools API未按预期更新TrainStatus值问题求助
问题:Drools规则未按条件触发,TrainStatus被无条件设置为Running
数据对象定义
TrainData
| Column A | Column B |
|---|---|
| trainID | integer |
| area | String |
TrainStatus
| Column A | Column B |
|---|---|
| TrainStatus | String |
| DriverName | String |
Drl规则文件
rule "set Train status" when TDobj : TrainData(trainID==111 && area=="South") TSobj : TrainStatus() then TSobj.setTrainStatus("running"); end
请求信息
- Endpoint:
http://localhost:8080/kie-server/services/rest/server/containers/instances/demo_1.0.0-SNAPSHOT
请求体
{ "lookup": null, "commands": [ {"insert": { "object":{ "TrainData":{ "trainID":112 , "area":"South"}}, "out-identifier": "TrainData", "return-object":true } }, {"insert": { "object":{ "TrainStatus":{ }}, "out-identifier": "TrainStatus", "return-object":true } }, { "fire-all-rules": {}} ] }
响应信息
{ "type": "SUCCESS", "msg": "Container demo_1.0.0-SNAPSHOT successfully called.", "result": { "execution-results": { "results": [ { "value": { "com.dummyspace.demo.TrainData": { "trainID": 112, "area": "South", "trainType": null } }, "key": "TrainData" }, { "value": { "com.dummyspace.demo.TrainStatus": { "trainStatus": "Running", "auditInterval": null, "hpbufferAllowance": null } }, "key": "TrainStatus" } ], "facts": [ { "value": { "org.drools.core.common.DefaultFactHandle": { "external-form": "0:5:2011994629:2011994629:5:DEFAULT:NON_TRAIT:com.dummyspace.demo.TrainData" } }, "key": "TrainData" }, { "value": { "org.drools.core.common.DefaultFactHandle": { "external-form": "0:6:1902014052:1902014052:6:DEFAULT:NON_TRAIT:com.dummyspace.demo.TrainStatus" } }, "key": "TrainStatus" } ] } } }
问题现象
规则逻辑应为:当TrainData的trainID=111且area="South"时,将TrainStatus设为"Running"。但实际无论传入的trainID和area是否符合条件,TrainStatus都会被设置为"Running",规则条件未生效。
问题原因及解决方法
1. 排查会话残留事实
Kie Server默认可能复用会话,若之前请求中插入过符合条件的TrainData事实,会导致后续请求即使传入不符合条件的数据,规则依然触发。解决方法:
在请求体最外层添加"dispose": true,确保每次请求使用全新会话,避免旧事实干扰:
{ "lookup": null, "dispose": true, "commands": [ // 原insert和fire-all-rules命令 ] }
2. 检查是否存在其他无条件规则
确认项目中是否有其他针对TrainStatus的规则,比如直接在when部分只写TSobj : TrainStatus()就设置状态的规则。这类规则会无条件触发,覆盖预期逻辑,若存在需删除或调整其条件。
3. 验证数据对象与规则的字段匹配
对比响应和你定义的数据对象:
- 响应中TrainData多了
trainType字段,TrainStatus多了auditInterval、hpbufferAllowance字段,说明实际数据对象和你提供的定义不一致。需确认规则中调用的setTrainStatus是否对应正确的字段,避免因字段名不匹配导致的默认值或额外逻辑触发。
4. 重新部署规则并验证
重新编译规则文件,确保修改后的规则正确部署到Kie容器。可通过以下接口查看容器内的规则列表,确认规则内容符合预期:
GET http://localhost:8080/kie-server/services/rest/server/containers/demo_1.0.0-SNAPSHOT/rules
5. 分场景测试验证
- 测试1:传入符合条件的TrainData(
trainID=111,area="South"),确认TrainStatus被设置为"Running"; - 测试2:传入不符合条件的TrainData(比如
trainID=112,area="South"),确认TrainStatus保持初始空值,未被修改。
内容的提问来源于stack exchange,提问作者Shalini
相关产品推荐
相关产品推荐

