我们构建了一个grails应用程序,它通过JMS消息与遗留系统集成,并利用JMS队列分发大批量作业。我们使用grails JMS插件来支持这些消息传递需求。我们发现了一个令人遗憾的一致性问题,我们正试图解决这些问题,并可以使用一些帮助。
典型的流程是:
但是,如果我向显示相同数据的控制器发出Web请求,则它与数据库一致。
我们的理论是,在处理JMS事件之间存在一些数据缓存,可能是在休眠会话中。由于grails请求处理似乎是我们希望确保一致性的,我们认为我们应该用类似的代码包装我们的事件处理。如果hibernate会话在JMS消息之间持久保存数据,我们假设我们正在寻找为每条消息设置和拆除hibernate会话。不幸的是,我们对grails-core不够熟悉,无法确定这样做的位置,以便我们可以根据需要重新使用该代码......我们也没有验证这是我们的问题。
显然,外部系统和我们的grails应用程序都写入同一个数据库并不理想。随着遗留系统的迁移,我们正在逐步解决这个问题,因此需要将所有内容移到grails应用程序中,但作为问题的短期解决方案是不可行的。
答案 0 :(得分:2)
我是JMS插件的作者。
使用默认侦听器配置,每次收到消息时都会设置一个新的休眠会话:
尝试在JMS接收消息开始时在域对象上调用.refresh()。如果这解决了问题,那么我们就会以某种方式泄漏hibernate会话状态。我们可能需要明确清除hibernate缓存。
你能否告诉我结果。