Spring AMQP中的交换和队列声明

dom*_*arr 4 messaging spring

我正在使用RabbitMQ并尝试重构我当前的本机java实现以使用Spring AMQP抽象.

使用Spring库声明交换,队列及其绑定是通过AMQPAdmin接口,但我不确定何时应该进行这种配置.

我有一个使用Rabbit生成消息的Web应用程序.另一个消费这些消息的应用程序.震惊:)

但是当显示交换/队列的声明时?

我是否将AMQPAdmin与Web应用程序一起部署,并在生产者和消费者的构造函数中进行交换/队列管理?

这些事情的宣言是一次性的,破产不需要再次了解它们,因此任何代码都将成为后续执行的NOOP.

我是否为管理代理创建了单独的应用程序?

这里目前的想法或最佳做法是什么?

dom*_*arr 6

似乎很少有人使用Spring的AMQP M1版本,所以我将用我所做的回答我自己的问题.

在生产者的构造函数中,我声明了交换.然后在RabbitTemplate上设置交换.我还将RabbitTemplate上的路由键设置为队列名称,但这不是必需的,但它是我将要使用的路由.

@Service("userService")
public class UserService {
    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public UserService(final RabbitAdmin rabbitAdmin,
                       final Exchange exchange,
                       final Queue queue,
                       @Qualifier("appRabbitTemplate") final RabbitTemplate rabbitTemplate) {

        this.rabbitTemplate = rabbitTemplate;

        rabbitAdmin.declareExchange(exchange);
        rabbitTemplate.setExchange(exchange.getName());
        rabbitTemplate.setRoutingKey(queue.getName());  
    }


    public void createAccount(final UserAccount userAccount) {
        rabbitTemplate.convertAndSend("Hello message sent at " + new DateTime());
    }
}
Run Code Online (Sandbox Code Playgroud)

在使用者的构造函数中,我声明了队列并创建了绑定.

public class Consumer implements ChannelAwareMessageListener<Message> {

    public Consumer(final RabbitAdmin rabbitAdmin, final Exchange exchange, final Queue queue) {
        rabbitAdmin.declareQueue(queue);

        rabbitAdmin.declareBinding(BindingBuilder.from(queue).to((DirectExchange) exchange).withQueueName());
    }

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        System.out.println(new String(message.getBody()));

        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然构造函数可以运行多次,但RabbitMQ只声明交换,队列和绑定一次.

如果你需要这个小例子项目的全部资源,请问,我会把它放在某处.