【问题标题】:Is KieSession.insert() and KieSession.fireAllRules() thread-safe?KieSession.insert() 和 KieSession.fireAllRules() 是线程安全的吗?
【发布时间】:2021-07-01 21:25:03
【问题描述】:

我将 DroolsSpring Boot 一起使用。在我的项目中,我正在制作 KieSessionKieContainerKieServices 的单例 Bean。 KieSession 将用于不同的单例服务和控制器。我想知道 KieSesion.insert()KieSession.fireAllRules() 是否是 thread-safe 与单例 bean 实现。或者我应该创建一个具有同步访问 KieSesion.insert() 和 KieSession.fireAllRules() 的实用程序类?

【问题讨论】:

  • 您应该考虑使用会话池。我非常怀疑会话是否会是线程安全的,因为在后台使用了多少数组列表来管理事实和工作内存——这只是要求并发修改异常。
  • @RoddyoftheFrozenPeas 我正在包装具有 ReentrantLock 的 KieSession 以进行同步。这应该没问题吧?
  • 所以您正试图限制您的应用程序,以便一次只能从一个 bean 中执行规则?听起来真的违反直觉/错误。
  • @RoddyoftheFrozenPeas 实际上我正在使用 JPA 持久性实现 KieSession。由于 KieSession 不是线程安全的,因此可能会发生 OptimisticLockException,从而使 KieSession 的整个 JPA 功能失效。如果 JPA 功能关闭,则应用程序重新启动后的恢复也会失败。只有重新启动应用程序才能恢复 JPA 功能。所以我想通过同步来限制它。你有什么建议?
  • @RoddyoftheFrozenPeas 这完全是错误的——看我的回答。请更新您的评论

标签: spring drools jbpm


【解决方案1】:

KieSession 自 Drools 6 以来一直是线程安全的,来自 manual

引擎处理多线程的代码已经部分 重写以去除大量同步点 并提高稳定性和可预测性。特别是这个新 实现允许更清晰的分离和更好的交互 在用户线程之间(执行插入/更新/删除操作 在会话上),Drools 引擎线程(执行正确的规则 评估)和计时器一(执行基于时间的操作,例如 事件到期)。

7.52.0.Final 开始,如果不需要,用户可以禁用线程安全以获得一些性能。这是relevant 发布说明:

根据默认配置,KieSession 是线程安全的,并且可以 安全共享并由多个线程同时使用。 但是,如果 KieSession 正在运行,则需要额外的 支持线程安全的同步点,这不是 需要,最终,它会减慢 KieSession 的性能。 因此,引入了一个新的 ThreadSafeOption,您可以使用它来 可选择禁用线程安全。 ThreadSafeOption 包括 两个值,包括 YES(默认)和 NO。

【讨论】:

猜你喜欢
  • 2021-06-19
  • 2011-10-08
  • 2021-10-12
  • 2015-04-18
  • 2011-10-07
  • 2012-03-02
  • 2011-10-28
  • 2023-03-14
  • 2016-08-24
相关资源
最近更新 更多