之前介绍的RabbitMQ的几种工作模式主要是体现其思想,下面是基于SpringBoot来针对RabbitMQ的几种工作模式的开发.
工作模式(work)
一.引入依赖
可以通过Spring项目创建时直接勾选Spring for RabbitMQ,也可以手动去中央仓库中下载.

二.添加配置
spring:
rabbitmq:
host: 110.41.51.65 RabbitMQ服务器所在的服务器IP
port: 15673 #默认
username: admin
password: admin
virtual-host: zwl #默认值为/
三.生产者代码
1.声明队列
@Configuration
public class RabbitMQConfig {
@Bean("workQueue")
public static Queue workQueue(){
return QueueBuilder.durable(Constants.work_queue).build();
//声明队列的名字状态
}
}
2.声明交换机
此处使用的是默认的交换机,所以交换机名称为空,rountingkey和队列同名.
3.发送消息
发送消息需要使用RabbitTemplate这个对象,它可以直接注入使用.
@RequestMapping("/request")
@RestController
public class ProducerController {
@Autowired
public RabbitTemplate rabbitTemplate;
@RequestMapping("/work")
public String ha(){
rabbitTemplate.convertAndSend("", Constants.work_queue,"我是消息");
return "发送成功";
}
}
4.观察结果
使用浏览器访问完后,就可以通过RabbitMQ可视化界面进行观察.

四.消费者代码
消费者需要知道RabbitListener这个监听类,此类可以监听指定的队列,从里面拿消息.
使用时RabbitListener时会立刻消费消息.
@Component
public class FanoutListener {
@RabbitListener(queues = Constants.fanout_queue1)
//此处的形参也可以设置为Message类,接受到的就是更加详细的消息
public void queueListener1(String message){
System.out.println("接收到消息::::::::::"+message);
}
}
发布订阅模式(publish)
前两步和上面的work一样,发布订阅模式有三种不同状态的交换机,这里演示其中的两种.
生产者代码(fanout)
1.声明队列和交换机
@Bean("fanoutQueue1")
public static Queue fanoutQueue1(){
return QueueBuilder.durable(Constants.fanout_queue1).build();
}
@Bean("fanoutQueue2")
public static Queue fanoutQueue2(){
return QueueBuilder.durable(Constants.fanout_queue2).build();
}
@Bean("fanoutExchange")
public static FanoutExchange fanoutExchange(){
return ExchangeBuilder.fanoutExchange(Constants.fanout_exchange).durable(true).build();
}
2.建立连接
发布订阅模式需要将队列和交换机之间建立连接,因为是fanout(广播)模式,消息会发给和交换机绑定所有的队列.
//建立连接
@Bean("fanoutBinding1")//形参中需要声明交换机的类型,加Qualifier注解是为了让Spring通过Bean的名称寻找Bean
public Binding fanoutBinding1(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange,@Qualifier("fanoutQueue1") Queue queue){
return BindingBuilder.bind(queue).to(fanoutExchange);
}
@Bean("fanoutBinding2")
public Binding fanoutBinding2(@Qualifier("fanoutExchange") FanoutExchange fanoutExchange,@Qualifier("fanoutQueue2") Queue queue){
return BindingBuilder.bind(queue).to(fanoutExchange);
}
3.发送消息
@RequestMapping("/fanout")
public String ha1(){
//三个参数是交换机名称,Rountingkey,消息正文
rabbitTemplate.convertAndSend(Constants.fanout_exchange, "","我是消息112121212");
return "发送成功";
}
四.消费者代码
监听两个队列进行消费.
@Component
public class FanoutListener {
@RabbitListener(queues = Constants.fanout_queue1)
public void queueListener1(String message){
System.out.println("接收到消息::::::::::"+message);
}
@RabbitListener(queues = Constants.fanout_queue2)
public void queueListener2(String message){
System.out.println("接收到消息????????????????????"+message);
}
}
生产者代码(Direct)
1.声明交换机和队列
@Bean("directQueue1")
public static Queue directQueue1(){
return QueueBuilder.durable(Constants.direct_queue1).build();
}
@Bean("directQueue2")
public static Queue directQueue2(){
return QueueBuilder.durable(Constants.direct_queue2).build();
}
@Bean("directExchange")
public static DirectExchange directExchange(){
return ExchangeBuilder.directExchange(Constants.direct_exchange).durable(true).build();
}
2.建立连接
建立连接时需要指定连接的方式,这里使用这样的连接方式.

@Bean("directBinding1")
public Binding directBinding1(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue1") Queue queue){
return BindingBuilder.bind(queue).to(directExchange).with("orange");
}
@Bean("directBinding2")
public Binding directBinding2(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){
return BindingBuilder.bind(queue).to(directExchange).with("black");
}
@Bean("directBinding3")
public Binding directBinding3(@Qualifier("directExchange") DirectExchange directExchange,@Qualifier("directQueue2") Queue queue){
return BindingBuilder.bind(queue).to(directExchange).with("orange");
}
3.发送消息
@RequestMapping("/direct/{ha}")
public String directProduct(@PathVariable("ha") String routingKey){
//routingKey作为参数传递
rabbitTemplate.convertAndSend(Constants.direct_exchange,
routingKey,"hello spring boot: direct "+routingKey);
System.out.println("++++++++++++++++++++++++++");
return "发送成功";
}
消费者代码
@RabbitListener(queues = Constants.direct_queue1)
public void queueListener1(String message){
System.out.println("接收到消息队列1::::::::::"+message);
}
@RabbitListener(queues = Constants.direct_queue2)
public void queueListener2(String message){
System.out.println("接收到消息队列2????????????????????"+message);
}