用于单元测试的嵌入式 ActiveMQ 在测试结束时抛出 JMSException

问题描述

我正在使用嵌入式 activeMQ 与 spring JMS 进行 junit 测试。测试全部通过。但是当测试完成时,在日志中看到以下异常。如何解决日志中出现的此错误

false

单元测试类如下所示:

javax.jms.JMSException: disposed due to prior exception
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:72)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1421)
at org.apache.activemq.ActiveMQConnection.close(ActiveMQConnection.java:688)
at org.springframework.jms.connection.SingleConnectionFactory.closeConnection(SingleConnectionFactory.java:501)
at org.springframework.jms.connection.SingleConnectionFactory.resetConnection(SingleConnectionFactory.java:389)
at org.springframework.jms.connection.CachingConnectionFactory.resetConnection(CachingConnectionFactory.java:205)
at org.springframework.jms.connection.SingleConnectionFactory.onException(SingleConnectionFactory.java:367)
at org.springframework.jms.connection.SingleConnectionFactory$AggregatedExceptionListener.onException(SingleConnectionFactory.java:721)
at org.apache.activemq.ActiveMQConnection$5.run(ActiveMQConnection.java:1967)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)                                                        
Caused by: org.apache.activemq.transport.TransportdisposedioException: disposed due to prior exception
at org.apache.activemq.transport.ResponseCorrelator.onException(ResponseCorrelator.java:125)
at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:114)
at org.apache.activemq.transport.vm.VMTransport.stop(VMTransport.java:233)
at org.apache.activemq.transport.TransportFilter.stop(TransportFilter.java:72)
at org.apache.activemq.transport.TransportFilter.stop(TransportFilter.java:72)
at org.apache.activemq.transport.ResponseCorrelator.stop(ResponseCorrelator.java:132)
at org.apache.activemq.broker.TransportConnection.doStop(TransportConnection.java:1194)
at org.apache.activemq.broker.TransportConnection$4.run(TransportConnection.java:1160)
... 3 common frames omitted
Caused by: org.apache.activemq.transport.TransportdisposedioException: peer (vm://localhost#5) stopped.

配置包含:

@SpringBoottest                                                         
public class CucumberSpringIntegration {
@Rule
public EmbeddedActiveMQbroker broker = new EmbeddedActiveMQbroker();
  @Test                                                                            
  public void someUnittest(){
   //some assertions
  }

参考来自此链接 activeMQ embedded Junit

解决方法

您需要为连接工厂添加预关闭挂钩。当您的代理在您的连接被破坏之前停止时会发生这种情况

@Rule
EmbeddedActiveMQBroker customizedBroker = new EmbeddedActiveMQBroker() {
    @Override
    protected void configure() {
        this.getBrokerService().setUseShutdownHook(true);
        this.getBrokerService().addPreShutdownHook(PROVIDE_SHUTDOWN_HOOK_HERE);
        // Perform additional configuration here...
    }
};