【问题标题】:Why are my grails JMS messages processing services using stale data?为什么我的 grails JMS 消息处理服务使用陈旧数据?
【发布时间】:2011-05-22 09:32:23
【问题描述】:

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

典型的工艺流程是:

  1. 外部系统更改了我们数据库中的状态,并发送了状态更改发生的消息
  2. 我们的 grails 应用程序处理消息,从数据库中提取与外部进程刚刚写入的数据相同的数据(旧系统修改的类/表未启用休眠辅助和查询缓存)。消息包含大量数据,但我们只使用 grails 应用程序中的类和标识符。
  3. 如果我们的 JMS 处理服务在处理之前的事件时已经与数据进行了交互,那么这些数据就是陈旧的。

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

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

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

【问题讨论】:

    标签: hibernate grails jms


    【解决方案1】:

    我是 JMS 插件的作者。

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

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

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

    你能告诉我结果吗?

    【讨论】:

    • 我们通过在加载消息之间缓存的数据结构之前引入以下代码解决了这个问题: sessionFactory.currentSession.flush()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多