【发布时间】:2011-05-22 09:32:23
【问题描述】:
我们构建了一个 grails 应用程序,它通过 JMS 消息与遗留系统集成,并利用 JMS 队列分发大批量作业。我们使用 grails JMS 插件来支持这些消息传递需求。我们发现了一个不幸的一致性问题,我们正在努力解决并需要一些帮助。
典型的工艺流程是:
- 外部系统更改了我们数据库中的状态,并发送了状态更改发生的消息
- 我们的 grails 应用程序处理消息,从数据库中提取与外部进程刚刚写入的数据相同的数据(旧系统修改的类/表未启用休眠辅助和查询缓存)。消息包含大量数据,但我们只使用 grails 应用程序中的类和标识符。
- 如果我们的 JMS 处理服务在处理之前的事件时已经与数据进行了交互,那么这些数据就是陈旧的。
但是,如果我向显示相同数据的控制器发出 Web 请求,它与数据库是一致的。
我们的理论是在处理 JMS 事件之间存在一些数据缓存,大概是在休眠会话中。由于 grails 请求处理似乎做了我们希望确保一致性的事情,我们认为我们应该用类似的代码来包装我们的事件处理。如果休眠会话在 JMS 消息之间保持数据,我们假设我们正在寻找为每条消息设置和拆除休眠会话。不幸的是,我们对 grails-core 不够熟悉,无法确定这是在哪里完成的,因此我们可以根据需要重新利用该代码......我们也没有验证这是我们的问题。
显然,外部系统和我们的 grails 应用程序都写入同一个数据库并不理想。随着时间的推移,我们正在通过从遗留系统迁移来解决这个问题,因此将所有内容都迁移到 grails 应用程序中是理想的,但作为该问题的短期解决方案是不可行的。
【问题讨论】: