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

时间:2010-12-08 17:53:58

标签: hibernate grails jms

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

典型的流程是:

  1. 外部系统更改数据库中的状态并发送状态更改发生的消息
  2. 我们的grails应用程序处理消息,从外部进程刚刚写入的数据库中提取相同的数据(对于遗留系统修改的类/表,不启用hibernate辅助和查询缓存)。该消息包含大量数据,但我们只使用grails应用程序中的类和标识符。
  3. 如果我们的JMS处理服务在处理上一个事件时已经与数据进行了交互,那么这些数据是陈旧的。
  4. 但是,如果我向显示相同数据的控制器发出Web请求,则它与数据库一致。

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

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

1 个答案:

答案 0 :(得分:2)

我是JMS插件的作者。

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

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

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

你能否告诉我结果。