为什么需要动态创建队列与绑定交换机?我在写项目的时候遇到这么个问题,我数据库中存在一个字段messageType指定为消息类型,消息类型存在三种,一种是通知类,一种是验证码类,一种是活动类。并且对应的,要将消息进行不同渠道的分发,还存在一个channelType,而他又存在QQ邮箱,手机短信、服务号三种不同的渠道。假如说我每增加一个渠道类型,我就必须再一次手动创建一个队列,那可太烦人了,并且还得新增一个新的监听器。而对应的,每个渠道商给的接口调用频率不同,如果我采用一个队列发送所有的渠道消息,这样一来,一旦某个服务被限流阻塞,那我核心服务就使用不了了。因此还需要对不同的渠道创建不同的队列进行消息隔离。这又面临一个问题,我怎么去动态的创建我自己的队列,不需要我每次都去手动新增队列、绑定队列?下面我说说自己的解决方案。当然,RabbitMQ的交换机的类型不同,对应的队列绑定方式也不太一样.
先复习复习,这些声明创建绑定方式
RabbitMQ中,声明队列以及绑定队列的几种方式
使用RabbitManager可视化图形界面创建、绑定队列
在queues中创建好队列
在exchanges中创建好交换机
在queues中,找到自己创建的队列,点进去,绑定上路由和交换机
或者
在exchanges中,找到自己创建的交换机,点进去,绑定上路由和交换机
反正无论你从哪进去,只要能将queue绑到交换机上,那就没问题。注意一些参数的选择。如果不理解可以看看我之前的文章。
写一个Config类,在Config类中声明队列绑定交换机
示例如下
/**
* 将队列与交换机绑定
*/
@Configuration
public class RabbitmqConfig {
//声明sms交换机
@Bean(RabbitmqConstant.SMS_EXCHANGE_NAME)
public Exchange SMS_EXCHANGE(){
//durable(true) 持久化,mq重启之后交换机还在
return ExchangeBuilder
.topicExchange(RabbitmqConstant.SMS_EXCHANGE_NAME)
.durable(true)
.build();
}
//声明sms队列
@Bean(RabbitmqConstant.SMS_QUEUE_NAME)
public Queue SMS_QUEUE(){
return new Queue(RabbitmqConstant.SMS_QUEUE_NAME);
}
//sms队列绑定sms交换机,指定routingKey
@Bean
public Binding BINDING_ROUTING_KEY_SMS(@Qualifier(RabbitmqConstant.SMS_QUEUE_NAME) Que