当前位置: 首页 > 知识库问答 >
问题:

Spring JMS集成单元测试将消息留在队列上

贾烨
2023-03-14

我正在使用Spring4.3.5.Release和ActiveMQ5.14.3来处理消息队列。

<!-- Activemq connection factory -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <!-- brokerURL, You may have different IP or port -->
    <constructor-arg index="0" value="${message.broker.url}" />
</bean>

<!-- Pooled Spring connection factory -->
<bean id="jmsConnectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <constructor-arg ref="amqConnectionFactory" />
</bean>

<!-- ======================================================= -->
<!-- JMS Send, define default destination and JmsTemplate -->
<!-- ======================================================= -->
<!-- Default Destination Queue Definition -->
<bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue">
    <!-- name of the queue -->
    <constructor-arg index="0" value="${default.message.queue}" />
</bean>

<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver"/>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="defaultDestination" ref="defaultDestination" />
    <property name="destinationResolver" ref="jmsDestinationResolver"/>
    <property name="pubSubDomain" value="${pub.sub.domain}"/>
    <property name="receiveTimeout" value="${receive.timeout}"/>
</bean>
 public boolean sendResponse(final MyObjectDTO myObject) {
    boolean success = false;
    this.jmsTemplate.convertAndSend(ebvResponse);
    success = true;
    return success;
}

下面是我的单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =
{ "classpath:/spring/my-platform-services-context.xml" })
@Transactional
public class MessageUtilTest extends TestCase {

    @Autowired
    private MessageUtil messageUtil;

    @Test
    public void testConvertSendMessageToDefault() throws JsonParseException, JsonMappingException, IOException {
        MyObjectDTO myObject = new ManualCoverageDTO();
        myObject.setMessage(message);
        boolean success = messageUtil.sendResponse(myObject);
        assertEquals(true, success);
    }
}

这个测试工作得很好,并且消息会正确地进入队列!

因为单元测试是事务性的,所以我希望当测试结束时,消息会从队列中回滚,但似乎并非如此。

我知道这是一个“集成”测试,因为它实际上是接触ActiveMQ服务器并将消息放入队列。

那么,我如何使这真正事务性,使我刚刚放在队列上的消息真的在它完成时回滚,我必须手动告诉这个测试回滚吗?

我已经对数据库进行了数百次“集成”单元测试,在一次测试中的每次插入、更新或删除之后,以及测试结束后,数据库将回滚到测试前的状态,我希望我的消息队列或主题也能发生同样的事情。

这方面的任何帮助都是很好的。谢谢!

共有1个答案

符功
2023-03-14

您需要将JMSTemplate上的SessionTransacted设置为True

但是,请记住,除非提交测试消息,否则您将无法在任何地方接收测试消息。

 类似资料:
  • 我有一个spring boot JMS应用程序,它在启动期间加载多个WebShpere MQ队列,并将消息从这些队列复制到另一个队列。一切正常,但我正在开始一些单元测试,我想有几件事我不理解。因此,我有一个config类,它包含一组带注释的bean,其中一个bean是在JMSListener启动之前执行消息加载的类。我有简单单元测试: 这个测试通过了,但我只希望简单地检查我的,看看它们是否相等并完

  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet

  • 我需要在我的应用程序中进行单元测试JMSXGroupID。有人能告诉我是否有示例文章或参考文献来实现这一点吗?我试图在ActiveMQ门户中查看参考文献,但看起来下面的Hudson链接坏了。我正在使用Spring JMS进行编程。 http://activemq.apache.org/junit-reports.html

  • 目前我正在使用SQS-Lambda集成 Lambda的并发可用。SQS批次设置为1记录,0延迟。 SQS的可见性超时为15分钟,Lambda最大执行时间为15分钟 我会注意到,有时SQS消息在飞行中被卡住,根本没有被任何Lambda处理(它们在15分钟后落入死信队列,CloudWatch显示没有Lambda被消息调用) 有人面临过同样的问题吗? 我在VPC内部运行Lambda,如果这很重要的话

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;