Spring Boot 动态创建队列并将其绑定到单个Exchange

kmbjn2e3  于 2023-05-28  发布在  Spring
关注(0)|答案(2)|浏览(150)

我有一个交换(exchange1),它可以根据routing-key-expression路由到n不同的队列。
1.所有图像消息应转到队列1
1.所有文档消息都应转到队列2
1.所有视频消息应转到默认队列3
在未来,队列数量可以增加,如(所有视频和mp4扩展应该转到queue4
我们如何创建队列并将其动态绑定到一个特定的交换,并且应该只使用一个流侦听器?

rryofs0p

rryofs0p1#

它不能通过属性直接使用Spring Cloud Stream完成。
您必须使用所需的路由键声明ExchangeQueueBinding@Bean s,然后配置消费者绑定以不声明队列和绑定),然后设置s.c.s.consumer.multiplex=trues.c.s.destination=queue1,queue2,queue3
请参阅使用现有队列/交换以了解如何禁用绑定器配置。

g2ieeal7

g2ieeal72#

在Sping Boot 中使用Spring-AMQP插件可以轻松完成。我已经附上了下面的片段如何可以实现。(我相信代码比理论上的话更有说服力):

package com.savk.workout.spring.rabbitmqconversendreceivefanoutproducer;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class DynamicBindingDemo {

    @Autowired
    private RabbitAdmin rabbitAdmin;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private boolean switchedOn = true;

    //Toggle binding programatically
    @Scheduled(fixedRate = 10000L)
    public void manipulateBinding() {
        Exchange exchange = ExchangeBuilder.directExchange("exchange").autoDelete().build();
        Queue queue = QueueBuilder.nonDurable("queue").build();
    
        Binding binding = BindingBuilder.bind(queue).to(exchange).with("routingkey").noargs();
        
        if(switchedOn) {
            rabbitAdmin.declareBinding(binding);
        } else {
            rabbitAdmin.removeBinding(binding);
        }
    }

    @Bean
    public RabbitAdmin rabbitAdmin() {
        return new RabbitAdmin(rabbitTemplate.getConnectionFactory());
    }

}

确保你也有相应的RabbitListener:

@RabbitListener(queues = "queuename")
@RabbitHandler
public String handle(String msg)  {
    System.out.println("RCVD :: " + msg);
    String response = "PONG { " + msg + " } from INSTANCE " + INSTANCE;
    return response;
}

你可以看到一切都可以动态地完成。您所需要的就是使用绑定进行操作。

相关问题