【问题标题】:Spring JMS Testing and Transactional RollbackSpring JMS 测试和事务回滚
【发布时间】:2011-10-06 22:46:27
【问题描述】:

我有一个使用 Spring 的 SpringJUnit4ClassRunner 的测试工具(它会在每个 JUnit 测试结束时自动回滚数据库更新)。现在我想测试我的基于 Spring 的 JMS 代码:

  1. 创建了一些数据库项
  2. 发送 JMS 消息以执行某项操作
  3. MDP 获取消息并在 DB 中执行其他操作

测试中实际发生的情况如下:

  1. Spring 在线程 1 上开始事务 (tx1)
  2. 数据库项目是在 tx1 上下文中创建的
  3. JMS 消息已发送
  4. 事务 tx1 回滚,线程 1 退出
  5. 线程 2 启动 MDP,开始事务 tx2,读取消息,然后 DB 工作
  6. 线程 2 提交 tx2,因为它没有被测试工具启动,然后退出

我想要发生的是 tx1 和 tx2 都由SpringJUnit4ClassRunner 控制,所以我得到了自动回滚。如果他们可以共享相同的整体事务上下文,那就更好了。现在,如果 tx1 中保存了某些内容,即使线程 1 没有回滚该 tx,tx2 也不会看到 DB 更改。

【问题讨论】:

    标签: spring junit jms


    【解决方案1】:

    您需要使用支持 XA 的事务管理器,因此能够在数据库和 JMS 引擎上进行两阶段提交。有几个这样的事务管理器(Bitronix、Atomikos 等)免费提供。

    如果您已经使用了这样的事务管理器(因为您的应用程序在提供它的应用程序服务器中运行),但您不想为单元测试配置如此繁重的东西,那么实施两个单元测试

    • JMS 部分被模拟的地方(仅用于测试 DB 项的创建),
    • 一种只测试 JMS 消息处理的方法

    请注意,如果没有 XA,您可能必须处理一些奇怪的情况,即处理了 JMS 消息但尚未提交第一个事务,或者提交了数据库事务但发送消息失败。

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 2016-10-07
      • 2017-11-07
      • 1970-01-01
      • 2015-06-19
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多