Spring AmqpTemplate嵌套自动装配

时间:2014-09-17 15:29:48

标签: java spring junit rabbitmq spring-amqp

我有一个服务负责在RabbitMQ队列上放置消息。我已经设置了AMQP配置,以便我可以将AmqpTemplate类自动装入服务中。当我将逻辑移动到JUnit测试的主体中时,此配置有效。

但是,当我使用自动装配的服务创建测试并调用方法来触发AmqpTemplates convertAndSend方法时,没有任何反应。使用wireshark我已经看到它仍然与RabbitMQ服务器握手,但是没有创建交换,即使我正在使用RabbitMQ的firehose跟踪选项,也没有消息出现在任何队列中。

代码如下:

<!-- AMQP messaging configurations starts here -->
<!-- Spring AMQP connection factory -->
<rabbit:connection-factory id="connectionFactory"
                           host="localhost"
                           port="5672"
                           username="guest"
                           password="guest"
                           channel-cache-size="25"/>

<!-- Queues -->
<rabbit:queue name="test.queue"/>

<!-- Exchanges with their queue bindings -->
<rabbit:topic-exchange name="test.exchange">
    <rabbit:bindings>
        <rabbit:binding queue="test.queue" pattern="test.*"/>
    </rabbit:bindings>
</rabbit:topic-exchange>

<!-- Spring AMQP template - Creates a bean which can send a message to the topicExchange-->
<rabbit:template id="testTemplate"
                 connection-factory="connectionFactory"
                 exchange="test.exchange"/>

<!-- Spring AMQP Admin -->
<rabbit:admin connection-factory="connectionFactory"/>

上面的代码段出现在我的应用程序上下文中,用于JUnit测试。

@Service
public class AsyncQueueServiceImplementation implements AsyncQueueService
{

  @Autowired
  private AmqpTemplate template;

  @Override
  @Async
  public void publish()
  {
    template.convertAndSend("test.debug", "test payload");
  }
}

上面的代码段是负责实际将对象发送到AmqpTemplate的服务。请注意,AmqpTemplate在这里是自动装配的。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application-context-unitTests.xml" })
public class AsyncTraceServiceImplementationTest
{

  @Autowired
  AsyncTraceService traceService;

  @Test
  public void testPublishAtDebugLevel()
  {
    traceService.publish();
  }
} 

以上段是JUnit测试。它使用包含所有rabbit mq配置的应用程序上下文。然后它在服务中自动装配并调用该消息。

当我放置简单的System.out.println时,我可以看到AmqpTemplate在服务中都被实例化但似乎没有做到预期的事情。

这可能是由于某种原因没有传递给服务的上下文的问题。

我尝试使用ReflectionTestUtils从Junit测试中设置服务中的模板字段,但我无法这样做。

1 个答案:

答案 0 :(得分:0)

我成功解决了这个问题。

问题出在我正在使用的RabbitMQ主题中。交流收到了一个未知的主题,因此没有做任何事情。

更正此问题导致邮件出现在正确的队列中,因为交换机能够正确路由邮件。