【发布时间】:2015-07-01 14:31:03
【问题描述】:
我创建了一个全状态知识会话,我用它在会话中插入多个对象。
StatefulKnowledgeSession ksession = initializeDrools(runtimeDrlFile.getFilePath());
private StatefulKnowledgeSession initializeDrools(String filePath) throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newFileResource("E:\\drools\\" + filePath), ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase.newStatefulKnowledgeSession();
}
假设我有两张地图,比如
Map<String, Object> map = new HashMap<String, Object>(); // Assume somthing is stored in it
Map<String, Object> maps = new HashMap<String, Object>(); // ""
现在我已经将两个对象都插入了 ksession 并触发了所有规则。
ksession.insert(maps);
ksession.insert(map);
ksession.fireAllRules();
这是我的 drools 文件。
import java.util.Map;
rule "Category Level"
when
$map: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
then
$map.put("Discount", String.valueOf("10.00"));
System.out.println($map);
System.out.println($maps);
end
它显示我是
Caused by: java.lang.IllegalArgumentException: Could not parse knowledge.
如果我删除System.out.println($maps);,它就可以正常工作。如果我在 drl 文件中用$maps 替换所有出现的$map,它也可以正常工作,但现在我无法访问$map,反之亦然。
我将多个对象传递到口水的逻辑有什么问题吗?
更新:
清除非法参数例外后,
import java.util.Map;
rule "Category Level"
when
$maps: Map()
$map: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
then
$map.put("Discount", String.valueOf("10.00"));
System.out.println($map);
System.out.println($maps);
end
现在的问题是sysout 正在打印$map 的值。为什么$maps值被$map替换?
【问题讨论】:
-
一个声明一次只能代表一个事实,因此 $map 只是一个事实。也没有 $maps 的声明,因此当您尝试打印它时,您实际上是在打印一些不存在的东西。
-
@ConMan,是的..现在我明白了..
-
@ConMan,我已经更正了声明部分,但奇怪的是,无论我在 java 中存储在
$maps中并传递到流口水,当我输入System.out.println($map); System.out.println($maps);时,两者都在打印存储在$map中的值。知道为什么会这样吗?
标签: java drools rule-engine