Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringJMS测试和事务回滚_Spring_Junit_Jms - Fatal编程技术网

SpringJMS测试和事务回滚

SpringJMS测试和事务回滚,spring,junit,jms,Spring,Junit,Jms,我有一个使用Spring的SpringJUnit4ClassRunner(在每个JUnit测试结束时自动回滚DB更新)的测试工具。现在我想测试我的基于Spring的JMS代码: 创建了一些数据库项 发送JMS消息以执行某些操作 MDP拾取消息并在DB中执行其他操作 测试中实际发生的情况如下: Spring在线程1上开始事务(tx1) DB项是在tx1上下文中创建的 发送JMS消息 事务tx1回滚,线程1退出 线程2启动MDP,开始事务tx2,读取消息,并执行DB工作 线程2提交tx2,因为其未被

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

  • 创建了一些数据库项
  • 发送JMS消息以执行某些操作
  • MDP拾取消息并在DB中执行其他操作
  • 测试中实际发生的情况如下:

  • Spring在线程1上开始事务(tx1)
  • DB项是在tx1上下文中创建的
  • 发送JMS消息
  • 事务tx1回滚,线程1退出
  • 线程2启动MDP,开始事务tx2,读取消息,并执行DB工作
  • 线程2提交tx2,因为其未被测试线束旋转,并退出

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

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

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

    • 其中JMS部分是模拟的(仅用于测试DB项的创建)
    • 其中只测试JMS消息处理
    请注意,如果没有XA,您可能必须处理处理JMS消息而第一个事务尚未提交的奇怪情况,或者数据库事务已提交但消息发送失败的情况