在运行时构造@RabbitListener的最简单方法

Boj*_*vic 2 java amqp spring-integration rabbitmq spring-amqp

在运行时构造它的最简单方法是什么?

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(value = "providedAtRuntime", durable = "true"),
    exchange = @Exchange(value = "providedAtRuntime", ignoreDeclarationExceptions = "true"),
    key = "providedAtRuntime"), containerFactory = "cFac")
public class RabbitProcessor {
    @RabbitHandler
    public void receive (String smth){
        System.out.println(smth);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想定义监听器,但在运行时提供交换,队列名称和绑定.此侦听器也不应自动启动,而应由start()方法调用.同时它应该自动声明绑定和队列等.当调用stop()时,它应该停止消耗.

Non*_*ika 6

我认为使用注释是不可能的,但您可以创建自定义SimpleMessageListenerContainer.

这是一个简单的解决方案:

public static AbstractMessageListenerContainer startListening(RabbitAdmin rabbitAdmin, Queue queue, Exchange exchange, String key, MessageListener messageListener) {
    rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(key).noargs());
    SimpleMessageListenerContainer listener = new SimpleMessageListenerContainer(rabbitAdmin.getRabbitTemplate().getConnectionFactory());
    listener.addQueues(queue);
    listener.setMessageListener(messageListener);
    listener.start();

    return listener;
}
Run Code Online (Sandbox Code Playgroud)

你可以称之为:

ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);

 ConnectionFactory connectionFactory = ctx.getBean(ConnectionFactory.class);
 RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
 AbstractMessageListenerContainer container = startListening(rabbitAdmin, rabbitAdmin.declareQueue(),
         new DirectExchange("amq.direct"), "testRoute", message -> {
             System.out.println(new String(message.getBody()));
         });
Run Code Online (Sandbox Code Playgroud)

你可以

AbstractMessageListenerContainer.destroy()AbstractMessageListenerContainer.stop()它.

测试了春季启动1.5.8.RELEASE和RabbitMQ 3.6.10