Spring KieSession.insert()和KieSession.fireAllRules()是否线程安全?

Spring KieSession.insert()和KieSession.fireAllRules()是否线程安全?,spring,drools,jbpm,Spring,Drools,Jbpm,我正在使用带有弹簧靴的Drools。在我的项目中,我正在制作KieSession、KieContainer和KieServices的单例bean。该会话将在不同的单例服务和控制器中使用。我想知道KieSesion.insert()和KieSession.fireAllRules()对于单例bean实现是否是线程安全的。或者我应该创建一个实用程序类,该类具有对KieSesion.insert()和KieSession.fireAllRules()的同步访问权限吗?自Drools 6以来,从 引擎中

我正在使用带有弹簧靴的Drools。在我的项目中,我正在制作KieSession、KieContainer和KieServices的单例bean。该会话将在不同的单例服务和控制器中使用。我想知道
KieSesion.insert()
KieSession.fireAllRules()
对于单例bean实现是否是线程安全的。或者我应该创建一个实用程序类,该类具有对KieSesion.insert()和KieSession.fireAllRules()的同步访问权限吗?

自Drools 6以来,从

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

由于
7.52.0.Final
,如果不需要获得某些性能,用户可以禁用线程安全性。以下是发行说明:

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


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