【发布时间】:2011-06-20 17:20:33
【问题描述】:
在我现在正在处理的应用程序中,我需要定期检查数以万计的对象是否符合某种服务的要求。决策图本身采用以下形式,略大:
在每个末端节点(圆圈)中,我需要运行一个操作(更改对象的字段、日志信息等)。我尝试使用 Drool Expert 框架,但在这种情况下,我需要为图中通向终端节点的每条路径编写一个长规则。 Drools Flow 似乎也不是为这样的用例而构建的——我取一个对象,然后,根据沿途的决定,我最终到达一个末端节点;然后再次为另一个对象。或者是吗?您能给我一些此类解决方案的示例/链接吗?
更新:
Drools Flow 调用可能如下所示:
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();
for(int i = 0; i < 10000; i++) {
Application app = somehowGetAppById(i);
// insert app into working memory
FactHandle appHandle = ksession.insert(app);
// app variable for action nodes
params.put("app", app);
// start a new process instance
ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
while(true) {
if(instance.getState() == instance.STATE_COMPLETED) {
break;
}
}
// remove object from working memory
ksession.retract(appHandle);
}
也就是说:我会获取一个 Application 对象,为它启动一个新进程,当进程完成时(最终的操作节点会以某种方式修改应用程序),我会从工作内存中删除该对象并重复一个新的 App 对象的过程。您如何看待这个解决方案?
解决方案:
我最终使用了 Drools Flow,它工作得很好。我的决策过程并不像 Drools Expert 所要求的那样简单,并且取决于决策树中的哪个过程需要从数据库中加载对象列表、转换它们、做出决策、记录所有内容等。我使用 Process 对象它作为参数传递给进程并存储我的所有全局变量(用于进程)和一些在树中不同点重复的便捷方法(因为在Script Task 节点中编写 Java 代码本身不是很方便)。我最终还使用 Java 来做出决定(而不是 mvel 或规则)——它更快,我会说更容易控制。我使用的所有对象都作为参数传递,并在代码中用作普通 Java 变量。
【问题讨论】:
标签: java drools decision-tree expert-system drools-flow