Spring JMS测试和事务回滚

时间:2011-10-06 14:23:20

标签: spring junit jms

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

  1. 创建了一些数据库项目
  2. 发送JMS消息以执行某些操作
  3. MDP接收消息并在数据库中执行其他操作
  4. 测试中实际发生的情况如下:

    1. Spring在线程1上开始事务(tx1)
    2. 数据库项目在tx1上下文
    3. 中创建
    4. 发送JMS消息
    5. 转回tx1并退回线程1
    6. 线程2旋转MDP,开始事务tx2,读取消息,并使数据库工作
    7. 线程2提交tx2,因为它没有被测试工具旋转,并退出
    8. 我想要发生的是tx1和tx2都由SpringJUnit4ClassRunner控制,所以我得到自动回滚。如果他们可以共享相同的整体交易背景,那就更好了;现在,如果在tx1中保存了某些内容,即使线程1没有回滚该tx,tx2也不会看到数据库发生变化。

1 个答案:

答案 0 :(得分:2)

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

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

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

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