hibernate – 为什么我的grails JMS消息使用陈旧数据处理服务?

我们构建了一个grails应用程序,它通过JMS消息与遗留系统集成,并利用JMS队列分发大批量作业.我们使用grails JMS插件来支持这些消息传递需求.我们发现了一个令人遗憾的一致性问题,我们正试图解决这个问题,并且可以使用一些帮助.

典型的流程是:

>外部系统更改数据库中的状态,并发送状态更改发生的消息
>我们的grails应用程序处理消息,从外部进程编写的数据库中提取相同的数据(对于遗留系统修改的类/表,不启用hibernate辅助和查询缓存).该消息包含大量数据,但我们只使用grails应用程序中的类和标识符.
>如果我们的JMS处理服务在处理上一个事件时已与数据进行了交互,则这些数据是陈旧的.

但是,如果我向显示相同数据的控制器发出Web请求,则它与数据库一致.

我们的理论是,在处理JMS事件之间存在一些数据缓存,可能是在休眠会话中.由于grails请求处理似乎是我们希望确保一致性的,我们认为我们应该用类似的代码包装我们的事件处理.如果hibernate会话在JMS消息之间持久保存数据,我们假设我们正在寻找为每条消息设置和拆除hibernate会话.不幸的是,我们对grails-core不太熟悉,无法确定这样做的位置,以便我们可以根据需要重新使用该代码……我们也没有验证这是我们的问题.

显然,外部系统和我们的grails应用程序都写入同一个数据库并不理想.随着遗留系统的迁移,我们正在解决这个问题,因此需要将所有内容移到grails应用程序中,但作为问题的短期解决方案是不可行的.

最佳答案 我是JMS插件的作者.

使用默认侦听器配置,每次收到消息时都会设置一个新的hibernate会话:

https://github.com/gpc/grails-jms/blob/master/src/groovy/grails/plugin/jms/listener/adapter/PersistenceContextAwareListenerAdapter.groovy

尝试在JMS接收消息开始时在域对象上调用.refresh().如果这解决了问题,那么我们就会以某种方式泄漏hibernate会话状态.我们可能需要明确清除hibernate缓存.

你能告诉我结果吗?

点赞