[英]Persisting Drools Knowledge Session
我在一个学区工作,我们正在计划使用Drools为地区成员学校的学生群体实施以下类型的规则:
所有这些规则都可以使用Drools专家简单表达。 此外,学生的规则处理不需要是同步的。 关于实现此问题的最佳方法,我有几个问题。
从一个角度来看,这可以被视为一个事件流的监控系统。 这让我想到创建一个有状态的会话,每个新事件都将插入其中。 然而,事件发生在9个月的过程中并且相对不频繁。 此外,我们可以建立每个学校的课程,或每个学生的课程。
另一种选择是在为该学生处理事件后为每个学生坚持一个会话。 当下一个事件进入时,我们将从存储中检索其会话并插入新事实。 这样我们就不需要为每次引擎运行检索所有事实来获得学生的状态。 会支持这样的配置吗? 这样做有什么缺点吗?
第三种方法是通过检索规则需要运行的所有其他事实,创建新的KnowledgeSession并运行规则来响应学生的新事实。
任何关于什么可能是最好的方法的建议将不胜感激。
戴夫
我会选择2号解决方案:每个学生一次。 鉴于你不打算与会话进行太多交互,我会把它保存在数据库中,只在需要时恢复它:新的缺席/事件到来,该学生的会话从db恢复,事实插入后,将执行规则并检索结果状态。
我在这种情况下看到的主要缺点是,创建关于多个学生的规则并不简单,您必须将您的事实提供给多个会话。 例如,如果您在一个班级中有超过10名具有重要地位的学生,则需要发出警报。 在这种情况下,每个类的会话就足够了。 所以,正如你所看到的,你必须决定什么对你更好。 但无论你选择的“单位”(学校,班级,学生),我仍然会向你推荐我之前提到的执行流程。
Drools已经使用JPA支持数据库持久性。 您可以在此处获得有关此功能的更多信息: http : //docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e3961
基本思想是使用名为JPAKnowledgeService
的辅助类,而不是使用kbase.newStatefulKnowledgeSession()
创建JPAKnowledgeService
。 此类将返回StatefulKnowledgeSession
的包装器,该包装器将在每次方法调用后保持其状态。 在这个类中,您将找到两个重要的方法: newStatefulKnowledgeSession()
,用于创建新的ksession和loadStatefulKnowledgeSession loadStatefulKnowledgeSession()
以从数据库中检索现有会话。
希望能帮助到你,
有第四种选择可以使维护更简单。 为所有学生建立整个学区的单一状态知识会话。 处理完每个事件后,如果需要在JVM发生故障时重建工作内存,则会保留会话。 您将需要更大的RAM和堆空间分配,但在今天的RAM中便宜。 (我们使用32 GB RAM并分配16 GB XM和Xmx)最有可能的是,只要您拥有24x7服务器,您的JVM就永远不会停机。
懒惰我会采取第三种方法。 我将所有事件存储在数据库中,然后我将按照每天,每周,每月(根据需要)批量处理所有学生。 这将允许您创建一个会话,其中包含涵盖多个学生,班级等的规则。如果您没有超过3百万的学生,您将会很好,这将是一个高性能的应用程序。
感谢您的建议和意见。 我倾向于#2有两个原因:
需要注意的是,如果规则发生变化,我们需要根据新的规则库重新评估所有受影响的学生,这意味着收集所有事实并从学年开始。 这应该不会发生太多,但如果它变得更频繁,那么我可能会转向第3种方法。
再次感谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.