Spring JMS测试和事务性回滚



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

  1. 创建了一些DB项
  2. 发送JMS消息来做某事
  3. MDP获取消息并在DB
  4. 中执行其他操作。

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

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

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

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

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

  • 模拟JMS部分(仅测试DB项的创建),
  • 和一个只测试JMS消息处理的

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

最新更新