在我正在处理的应用程序中,我需要定期检查成千上万个对象对某种服务的资格。决策图本身的形式如下,只是要大得多:

在每个终端节点(圆圈)中,我需要运行一个操作(更改对象的字段、日志信息等)。我尝试使用Drool框架,但在这种情况下,我需要为图中通向端点节点的每一条路径编写一个长规则。Drools流似乎也不是为这样一个用例而构建的--我接受一个对象,然后,根据沿途的决策,我最终进入一个结束节点;然后再为另一个对象创建。还是真的是这样?你能给我举几个例子/链接到这样的解决方案吗?
更新:
Drools流调用可能如下所示:
// 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流,它一直运行得很好。我的决策过程并不像Drools专家所要求的那么简单,并且取决于决策树中的位置,它需要从数据库加载对象列表、转换对象、进行决策、记录一切等等。我使用传递给流程的Process对象作为参数,并存储我的所有全局变量(用于流程),以及在树的不同位置重复的一些方便的方法(比如在Script Task节点中编写Java代码本身不太方便)。最后,我还使用了Java来做决策(而不是mvel或规则)--它更快,而且更容易控制。我使用的所有对象都作为参数传递,并在代码中作为普通Java变量使用。
发布于 2011-02-03 15:33:53
流口水专家绝对是该走的路。
如果您想避免在更高的节点上重复自己,那么诀窍是使用insertLogical (如果您处于无状态会话,只使用insert ),并理解规则可以触发规则(这不是您父亲的SQL查询)。例如:
// we just insert Customer objects in the WM
rule "evaluateRetired"
when
$c : Customer(age > 65)
then
insertLogical(new Retiree($c));
end
rule "evaluteRetireeIsFemale"
when
$r : Retiree(customer.gender == Gender.FEMALE, $c : customer)
then
...
end如果决策关系图经常更改(您希望非程序员编辑它),请查看决策表(和DSL)上的文档。在这种情况下,您可能会对每条规则重复整个路径,但在大多数情况下,这实际上是可以的。
发布于 2011-02-03 15:12:34
您可以尝试iLog框架和规则引擎。
发布于 2014-05-26 12:35:20
我有一个类似的问题,并使用Neo4J节点数据库作为一个简单和非常灵活的规则引擎。您可以在REST服务接口中使用它,因此它独立于主应用程序。您还可以有一个单独的应用程序来配置规则(即使是由最终用户)。
https://stackoverflow.com/questions/4887456
复制相似问题