公众号merlinsea
- spring AMQP介绍
- 官网:https://spring.io/projects/spring-amqp
- Spring 框架的AMQP消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO的消息监听
- 提供不依赖于任何特定的AMQP代理实现或客户端库通用的抽象,最终用户代码将很容易实现更易替换、添加和删除AMQP,因为它可以 只针对抽象层来开发
- 提高我们的框架整合消息队列的效率,SpringBoot为更方便开发者使用RabbitMQ 推出了 spring-boot-starter-amqp的依赖。
前置条件: 在自己的云服务器上先部署好rabbitMQ。
- pom文件中引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
- 在application.yml中配置RabbitMQ服务端的信息【通过这些配置信息,spring就可以找到rabbitmq服务端的位置】
#消息队列 spring: rabbitmq: host: 39.107.221.166 #客户端的端口 port: 5672 #虚拟主机 virtual-host: /dev #密码 password: password #账号 username: admin
- 编写RabbitMQConfig配置类,并交给spring容器管理,主要是用于创建交换机和队列,并绑定关系,指定bindingkey
@Configuration public class RabbitMQConfig { //交换机名称 public static final String EXCHANGE_NAME = "order_exchange"; //队列名称 public static final String QUEUE = "order_queue"; /** * 创建topic交换机 * @return */ @Bean public Exchange orderExchange(){ return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build(); } /** * 创建队列 * @return */ @Bean public Queue orderQueue(){ return QueueBuilder.durable(QUEUE).build(); } /** * 交换机和队列绑定关系,并指定路由key * spring会把IOC容器中的Exchange和Queue按类型自动注入形参 */ @Bean public Binding orderBinding(Queue queue, Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("order.#").noargs(); } }
- 编写生产者
- 使用springboot 内置的RabbitTemplate对象来向交换机发送消息,同时指定消息的key
- 消息不一定要字符串,任意的对象都行,但【要求的是这些消息类型要实现Serializable接口即可以序列化】
@RestController @RequestMapping("/api/v1/producer") public class Producer { @Autowired private RabbitTemplate template; @RequestMapping("send_string") void testSendString() { for(int i=0;i<5;i++){ // 这里需要指明向那个交换机发送消息,key是什么,消息体是什么 template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "order.new","新订单"); } } @RequestMapping("send_user") void testSendUser(){ User user = new User("lianglin",24); template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "order.new",user); } }
- 编写消费者
- 消费者需要指定监听的队列,同时交由spring容器管理
- 可以有多个Handler,即消费者可以处理多种不同类型的消息,每当对列中有消息会根据消息的类型自动适配用于处理这种类型消息的handler
@Component //监听的队列名 @RabbitListener(queues = "order_queue") public class OrderMQListener { //收到消息执行的动作,处理String消息,自动根据消息body的类型适配合适的handler方法 @RabbitHandler public void messageHandler(String body, Message message){ long msgTag = message.getMessageProperties().getDeliveryTag(); System.out.println("msgTag="+msgTag); System.out.println("message="+message.toString()); System.out.println("body="+body); } //收到消息执行的动作,处理User消息 @RabbitHandler public void messageHandler(User user, Message message){ long msgTag = message.getMessageProperties().getDeliveryTag(); System.out.println("msgTag="+msgTag); System.out.println("message="+message.toString()); System.out.println("user="+user); } }