【问题标题】:Drools reusability issuesDrools 可重用性问题
【发布时间】:2011-01-13 03:17:48
【问题描述】:

我目前正在评估 JBoss Drools,并希望就我目前发现的可重用性问题向社区寻求帮助:

  1. 要创建知识库,必须导入 .drl 文件,但如果我只想使用 .drl 文件中的规则子集,而不是形成规则组(使用议程组或 RuleFlowGroup),还有其他方法可以做到这一点吗?使用规则组很容易使规则定义变得混乱,假设您有 10 个不同的规则子集重叠,那就是 10 个规则组...

  2. 有没有办法将事实动态插入到规则知识会话中?在我看来,在触发规则引擎之前,所有必需的事实/数据都需要插入到会话中,从而造成性能瓶颈......例如,如果其中一个事实驻留在数据库中,除非来自数据库的事实,否则无法触发引擎画了。如果引擎可以先处理其他事实,当数据库中的事实准备好时,将其动态插入会话中会更好。

【问题讨论】:

    标签: drools


    【解决方案1】:
    1. 这样做的好方法是使用议程组。另一种方法是,明智地分开你的规则包。

    2. 我理解您的问题,您可以使用 Fact Handles。

      在此处使用StatefullKnowledgeSession

      FactHandle objHandle = ksession.insert(fact);

    一段时间后,当您的事实从数据库中准备好时,您可以在当前运行的会话中修改事实。

    ksession.update(objHandle, newFactObject(of same class))
    

    更多详情,请前往http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html 第 2.1.2 章。有状态的知识会话。

    【讨论】:

    • 嗨,感谢您的及时回复 :) 对于 1. 我希望找到一种方法来选择以编程方式触发的规则 - 如果使用议程组,我将不得不修改规则文件。分离规则包可能很笨拙,因为我必须更改受影响 Java 类的类路径(以加载规则)。对于 2. 感谢您分享有关事实的信息。但是,如果知识会话完成运行后来自数据库的事实进入呢?从这个意义上说,在触发规则引擎之前,我仍然必须等待所有数据可用[如果我错了,请纠正我]。
    • 您好,1. 按包分开规则并不意味着您将规则放在不同的包中。规则包只是包含多个规则的组的名称。您可以使用不同的规则包(一个或多个)为不同的目的构建不同的规则库。 2. StateFullKnowledgeSession 需要手动处理。因此,在您没有从数据库中获取事实之前,您可以保持会话运行。然后手动处理它。如果从数据库中获取事实需要更多时间,那么您应该创建新会话。
    • 对于 1. 是的,我理解规则包,尽管我更喜欢对规则的触发进行更精细的控制(例如,使用 Java 代码,加载规则文件并仅触发此规则)。谢谢,我想我明白了 :) 对于 2,我忽略了关于 StateFullKnowledgeSession 需要手动处理的观点,还看到知识会话可以持久化,可能会采用持久化会话的设计,直到数据库中的事实准备好恢复会话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2015-07-09
    • 2018-07-17
    相关资源
    最近更新 更多