坚持口水知识会议

Dav*_*man 5 drools drools-fusion

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

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

所有这些规则都可以使用 Drools 专家来简单地表达。此外,学生的规则处理不需要同步。我有几个关于实现这一点的最佳方法的问题。

  1. 从一个角度来看,这可以看作是一个事件流的监控系统。这让我想到创建一个有状态的会话,每个新事件都将插入其中。然而,这些事件发生在 9 个月的过程中并且相对不频繁。此外,我们可以为每个学校或每个学生建立一个会话。

    • 将会话保留在内存中那么长时间会成为问题吗?
    • 如果服务器出现故障,我们是否需要从头开始重建会话状态,或者是否建议拍摄常规快照并仅恢复自快照时间以来发生的事实。
  2. 另一种选择是在为该学生处理事件后为该学生保留一个会话。当下一个事件到来时,我们将从存储中检索他们的会话并插入新的事实。这样我们就不需要为引擎的每次运行检索所有事实来获取学生的状态。会支持这样的配置吗?这样做有什么缺点吗?

  3. 第三种方法是通过检索规则需要运行的所有其他事实、创建新的 KnowledgeSession 并运行规则来响应学生的新事实。

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

戴夫

Est*_*rti 3

我会采用第二种解决方案:每个学生一次课程。考虑到您不会与会话进行太多交互,我会将其保存在数据库中,并且仅在需要时恢复它:新的缺勤/事件到达,该学生的会话从数据库恢复,事实插入,执行规则并检索结果状态。

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

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

基本思想是,kbase.newStatefulKnowledgeSession()不要使用名为 的帮助器类来创建 ksessions JPAKnowledgeService。此类将返回 a 的包装器,StatefulKnowledgeSession该包装器将在每次方法调用后保留其状态。在此类中,您将找到 2 个重要的方法:newStatefulKnowledgeSession()创建新的会话以及loadStatefulKnowledgeSession()从数据库检索现有会话。

希望能帮助到你,