欢迎来到“雪碧聊技术”CSDN博客!
在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。
让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!
目录
1、开发人员把需要创建的队列、交换机记下来,写到一个文档里,然后运维人员根据这个文档在控制台把所需的队列、交换机创建出来,此时很容易出错、效率低。
1、SpringAMQP提供了几个类,用来声明队列、交换机及其绑定关系
①Queue:用于声明队列,可以直接new,也可以用工厂类QueueBuilder构建对象。
②Exchange:用于声明交换机,可以直接new,也可以用工厂类ExchangeBuilder构建对象。
③Binding:用于声明队列和交换机的绑定关系,可以直接new,也可以用工厂类BindingBuilder构建对象。
①创建FanoutConfiguration配置类(因为我们要在里面创建Fanout交换机)
②启动项目,spring会根据上述的配置类,自动完成队列、交换机、绑定关系的创建
1、SpringAMQP还提供了基于@RabbitListener注解,来声明队列、交换机、绑定关系、routingKey
一、基于控制台创建队列、交换机的缺点
1、开发人员把需要创建的队列、交换机记下来,写到一个文档里,然后运维人员根据这个文档在控制台把所需的队列、交换机创建出来,此时很容易出错、效率低。
二、声明队列和交换机的方式一:编写配置类
1、SpringAMQP提供了几个类,用来声明队列、交换机及其绑定关系
①Queue:用于声明队列,可以直接new,也可以用工厂类QueueBuilder构建对象。
②Exchange:用于声明交换机,可以直接new,也可以用工厂类ExchangeBuilder构建对象。
注意:由于交换机分很多种类,因此Exchange接口下面有很多实现类:
③Binding:用于声明队列和交换机的绑定关系,可以直接new,也可以用工厂类BindingBuilder构建对象。
2、举例1
注意:
3、 举例2
①创建FanoutConfiguration配置类(因为我们要在里面创建Fanout交换机)
@Configuration //表明这是一个配置类
public class FanoutConfiguration {
//创建一个Fanout类型的交换机,叫做hmall.fanout1
@Bean
public FanoutExchange fanoutExchange(){
//ExchangeBuilder.fanoutExchange("hmall.fanout1").build();
return new FanoutExchange("hmall.fanout1");
}
//创建一个队列,叫做fanout.queue1
@Bean
public Queue fanoutQueue1(){
//QueueBuilder.durable("fanout.queue1").build();
return new Queue("fanout.queue1");
}
//将队列fanout.queue1,绑定到交换机hmall.fanout1上
@Bean
public Binding fanoutBinding1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
}
}
②启动项目,spring会根据上述的配置类,自动完成队列、交换机、绑定关系的创建
③去rabbitMQ管理页面查看
4、基于配置类的创建方式的缺点
创建Fanout类型的交换机时,使用这种配置类的方式还好。
但是当创建Direct类型、Topic类型的交换机时,就很麻烦,因为绑定队列时需要指定routingKey,而这种创建方式下,必须一个一个地指定,非常的麻烦、代码高度重复,如下:
说白了就是,在给队列指定routingKey时,我们不能批量完成,而是一个个地指定,所以很麻烦。
二、声明队列和交换机的方式二:使用注解
1、SpringAMQP还提供了基于@RabbitListener注解,来声明队列、交换机、绑定关系、routingKey
2、举例1
创建一个监听类
@Component //交给spring管理
public class MqListener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue1", durable = "true"),
exchange = @Exchange(name = "hmall.direct1", type = ExchangeTypes.DIRECT),
key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){
System.out.println("消费者1 收到了 direct.queue1队列的消息:【" + msg + "】");
}
}
启动项目,查看结果:
解读
- value = @Queue(name = "direct.queue1", durable = "true"),其中name表示队列的名称,durable=“true”表示要将该队列持久化到磁盘,就让该队列一直存在,而不是临时使用完就销毁的。
- exchange = @Exchange(name = "hmall.direct1", type = ExchangeTypes.DIRECT),其中name表示创建的交换机的名称,type表示交换机的类型。
- key = {"red", "blue"},表示该队列direct.queue1有两个routingKey,一个是red,一个是blue。
注意
@RabbitListener注解的主要职责是监听队列的消息,只是同时又完成了声明队列、交换机、routingKey的动作。
三、总结
以上就是在Java中声明RabbitMQ的队列和交换机的两种方式,想了解更多的RabbitMQ知识,请关注本博主~~