使用spring for RabbitMQ使用多个rabbitTemplate时,不会自动创建Exchange

时间:2016-08-04 18:08:10

标签: rabbitmq rabbitmq-exchange spring-rabbitmq

我正在使用CachingConnectionFactory并使其成为bean,以便在不存在队列和交换时自动创建它们。我创建了另一个bean RabbitTemplate,在其中我设置了一个交换。

@Bean
public RabbitTemplate receiptRabbitTemplate() throws URISyntaxException {
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory(rabbitMQServiceScheme,
            rabbitMQServiceHostName, rabbitMQServiceContextRoot, rabbitMQServiceUser, rabbitMQServicePassword));
    template.setMandatory(true);
    template.setChannelTransacted(true);
    Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JodaModule());
    objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    converter.setJsonObjectMapper(objectMapper);
    template.setMessageConverter(converter);
    template.setRetryTemplate(retryTemplate());
    template.setExchange("test.exchange"); //--------------------<
    return template;
}

现在我正在添加另一个RabbitTemplate,以便我可以向另一个交换机发送消息。因为它在同一个虚拟机中,所以我使用的是相同的ConnectionFactory bean。

@Bean
public RabbitTemplate receiptRabbitTemplate() throws URISyntaxException {
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory(rabbitMQServiceScheme,
            rabbitMQServiceHostName, rabbitMQServiceContextRoot, rabbitMQServiceUser, rabbitMQServicePassword));
    template.setMandatory(true);
    template.setChannelTransacted(true);
    Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JodaModule());
    objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    converter.setJsonObjectMapper(objectMapper);
    template.setMessageConverter(converter);
    template.setRetryTemplate(retryTemplate());
    template.setExchange("anothertest.exchange");//---------------<
    return template;
}

但是当我尝试发送消息时,只创建了一个交换。对于另一个我得到错误

Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange

关于我做错的任何指示?

1 个答案:

答案 0 :(得分:0)

为了声明任何交换,你需要一个RabbitAdmin bean,每个交换必须被定义为一个bean(不只是在模板中设置)。

请参阅Configuring the broker