drools - 坚持口水知识 session

标签 drools drools-fusion

我在一个学区工作,我们计划使用 Drools 为学区组成学校的学生群体实现以下类型的规则:

  • 如果学生在一年内有 3 次缺勤,他们的出勤指标将变为 WARN 状态。
  • 如果学生在一年内缺勤 6 次,他们的出勤指标将变为 CRITICAL 状态。
  • 如果学生在一年内发生 3 次重大行为事件,他们的行为指标将变为 WARN 状态。
  • 如果学生在一年内发生 2 次轻微和 2 次重大行为事件,他们的行为指标将变为“关键”状态。
  • ...这些只是我脑海中的例子,但还有更多类似的规则。

  • 所有这些规则都可以使用 Drools 专家来简单地表达。此外,学生的规则处理不需要同步。我有几个关于实现这一点的最佳方法的问题。
  • 从一个角度来看,这可以看作是一个事件流的监控系统。这让我想到创建一个有状态的 session ,每个新事件都将插入其中。然而,这些事件发生在 9 个月的过程中并且相对不频繁。此外,我们可以为每个学校或每个学生建立一个 session 。
  • 将 session 保留在内存中那么长时间会成为问题吗?
  • 如果服务器出现故障,我们是否需要从头开始重建 session 状态,还是建议定期拍摄快照并仅恢复自快照时间以来发生的事实。
  • 另一种选择是在为该学生处理事件后为该学生保留一个 session 。当下一个事件到来时,我们将从存储中检索他们的 session 并插入新的事实。这样我们就不需要检索引擎每次运行的所有事实来获取学生的状态。会支持这样的配置吗?这样做有什么缺点吗?
  • 第三种方法是通过检索规则需要运行的所有其他事实、创建新的 KnowledgeSession 并运行规则来响应学生的新事实。

  • 任何关于什么可能是最好的方法的建议将不胜感激。

    戴夫

    最佳答案

    我会选择解决方案 2:每个学生一节课。鉴于您不会与 session 进行过多交互,我会将其保存在 db 中,仅在需要时恢复它:新的缺席/事件到达,该学生的 session 从 db 中恢复,事实插入,执行规则并检索结果状态。

    我在这种情况下看到的主要缺点是,为多个学生创建规则并不简单,您必须将事实提供给多个 session 。例如,如果您想在一个类(class)中有超过 10 名处于 CRITICAL 状态的学生时发出警报。在这种情况下,每节课一个 session 就足够了。所以,正如你所看到的,你必须决定什么对你更好。但是无论您选择哪个“单位”(学校、类(class)、学生),我仍然会向您推荐我之前提到的执行流程。

    Drools 已经支持使用 JPA 进行数据库持久化。您可以在此处获得有关此功能的更多信息:http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e3961

    基本思想是,而不是使用 kbase.newStatefulKnowledgeSession() 创建您的 ksessions你使用名为 JPAKnowledgeService 的辅助类.此类将返回 StatefulKnowledgeSession 的包装器这将在每次方法调用后保持其状态。在本类(class)中,您将找到 2 个重要方法:newStatefulKnowledgeSession() , 创建一个新的 ksession 和 loadStatefulKnowledgeSession()从数据库中检索现有 session 。

    希望能帮助到你,

    关于drools - 坚持口水知识 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14841355/

    相关文章:

    java - 光规划器 :Error when displaying constraints scores

    spring - Drools 和 Camel : Failed to load type converters Cannot find any type converter classes [org. drools.camel.component]

    java - 流口水为什么 StatefulKnowledgeSession 有不同的知识库

    java - 从 Drools 规则调用 java 方法

    rules - Drools Fusion 是否有 "now"的概念?

    java - Drools针对不同用户的规则

    php - 如何将 Drools 与 PHP 应用程序一起使用?

    java - JAAS/JAAC、DROOLS 或自定义

    spring - Spring 服务中的 Drools XStream

    java - 比较流口水中的日期