目录
工作队列
1.引入依赖
2.配置rabbitMq
3.生产者
4.消费者
5.测试
工作队列模式的生产者
package com.example.rabbbitmq.springboot.controller;
import com.example.rabbbitmq.springboot.constant.Constants;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/producter")
@RestController
public class ProducterController {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/work")
public String work() {
//使用内置交换机,RoutingKey,和队列名称一致
for (int i = 0; i < 10; i++) {
rabbitTemplate.convertAndSend("", Constants.WORK_QUEUE, "hello spring amqp: work .." + i);
}
return "发送成功";
}
}
消费者
@RabbitListener是Spring框架中用于监听RabbitMQ队列的注解,通过使用这个注解,可以定义一个方法,便于从RabbitMQ队列中接收消息,该注解支持多种参数类型,这些参数类型代表了从RabbitMQ接收到的消息和相关消息:
String:返回消息的内容
Message:Spring的AMQP的MESSAGE类,便于从RabbitMQ中接收消息,该注解支持多种
Channel:RabbitMQ的通道对象,可以用于更高级的操作,比如手动确认消息。
package com.example.rabbbitmq.springboot.listener; import com.example.rabbbitmq.springboot.constant.Constants; import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class WorkListener { @RabbitListener(queues = Constants.WORK_QUEUE) public void queueListener(Message message, Channel channel){ System.out.println("listener 1 ["+ Constants.WORK_QUEUE+"]接收到消息:"+message+",channel:+"+channel); } @RabbitListener(queues = Constants.WORK_QUEUE) public void queueListener2(Message message){ System.out.println("listener2 ["+ Constants.WORK_QUEUE+"]接收到消息:"+message); } }
发布订阅模式
Fanout广播,将消息交给所有绑定到交换机的队列(Publish/Subscribe模式)
Direct:定向,把消息交给指定routing key的队列(Routing模式)
Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)
生产者代码
路由模式Routing
交换机类型为Direct
生产者
@RequestMapping("/direct/{routingKey}") //从路径中拿到routingKey获取到, public String direct(@PathVariable("routingKey") String routingKey){ rabbitTemplate.convertAndSend(Constants.DIRECT_EXCHANGE,routingKey,"hello spring amqp:direct,my routing key" + "is"+routingKey); return "发送成功"; }
消费者
package com.example.rabbbitmq.springboot.listener; import com.example.rabbbitmq.springboot.constant.Constants; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class DirectListener { @RabbitListener(queues = Constants.DIRECT_QUEUE1) public void queueListener(String message){ System.out.println("listener 1 ["+ Constants.DIRECT_QUEUE1+"]接收到消息:"+message); } @RabbitListener(queues = Constants.DIRECT_QUEUE2) public void queueListener2(String message){ System.out.println("listener2 ["+ Constants.DIRECT_QUEUE2+"]接收到消息:"+message); } }
通配符模式
Topic(通配符模式)
使用以上这些模式常见问题
1.复制粘贴时候,绑定类型出错
2.不能把原先是持久化的,变成非持久化(可以回界面,把这个删除了,再去声明)w
3.没有指定队列名称(他会找不到)
基于Spring+rabbitMQ进行通信
RabbitMQ用户下单成功后,会通知物流系统,进行发货
使用JSON格式传递对象,需要手动创建一个rabbitMQConfig
package com.example.orderservice.config; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean("orderQueue") public Queue orderQueue(){ return QueueBuilder.durable("order.create").build(); } @Bean //他会自动根据yml里面单信息帮助我们生成对象 public RabbitTemplate rabbitTemplate(ConnectionFactory factory,Jackson2JsonMessageConverter jsonMessageConverter){ RabbitTemplate rabbitTemplate=new RabbitTemplate(factory); rabbitTemplate.setMessageConverter(jsonMessageConverter); return rabbitTemplate; } @Bean public Jackson2JsonMessageConverter jsonMessageConverter(){ return new Jackson2JsonMessageConverter(); } }
生产者
package com.example.orderservice.controller; import com.example.orderservice.model.OrderInfo; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Random; import java.util.UUID; @RequestMapping("/order") @RestController public class OrderController { @Autowired private RabbitTemplate rabbitTemplate; @RequestMapping("/create") public String create(){ //不是真下单,不然需要参数校验,数据库保存,业务代码省略等等 //发送消息 OrderInfo orderInfo=new OrderInfo(); orderInfo.setOrderId(UUID.randomUUID().toString()); orderInfo.setName("商品"+new Random().nextInt(100)); rabbitTemplate.convertAndSend("","order.create","订单信息,订单ID:"+orderInfo); return "下单成功"; } }