【发布时间】:2021-07-01 21:25:03
【问题描述】:
我将 Drools 与 Spring Boot 一起使用。在我的项目中,我正在制作 KieSession、KieContainer 和 KieServices 的单例 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 这完全是错误的——看我的回答。请更新您的评论