SpringBoot 整合 RabbitMQ 实践

推荐阅读:阿里P8架构师谈:工作1-5年的Java工程师,怎样提高核心竞争力

                  阿里架构师直言:“没有实战都是纸上谈兵”!Redis实战PDF分享

                  奋发图强半年多,终于四面阿里如愿拿到心仪offer定级P7

1.在linux环境使用docker安装RabbitMQ

 
//拉取镜像 docker pull rabbitmq:management //启动镜像 docker run -di --name myrabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

安装成功后登陆控制台

2.生产者

pom.xml中引入RabbitMQ依赖

 
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-amqp</artifactId>   <version>1.3.5.RELEASE</version> </dependency>

配置RabbitMQ服务端连接,和交换机名称

application.yml

 
spring:   rabbitmq:     port: 5672     username: admin     password: admin     host: 192.168.200.128     virtual-host: / order:   fanout:     exchange: order.fanout.exchange

生产者向MQ发送消息

Producer.java

 
package com.cott.gmail.bootuserserviceprovider.mq; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; import java.util.UUID; @Component public class Producer {     @Autowired     private RabbitTemplate rabbitTemplate;     @Value("${order.fanout.exchange}")     private String exchangeName;     public void sendMsg() {         String orderId = UUID.randomUUID().toString();         String message = "你的订单信息是:" + orderId + ",日期是:" + new Date();         rabbitTemplate.convertAndSend(exchangeName, message);     } }

在用户接口的实现类中,调用生产者的方法

UserServiceImpl.java

 
package com.cott.gmail.bootuserserviceprovider.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.cott.gmail.bean.UserAddress; import com.cott.gmail.bootuserserviceprovider.mq.Producer; import com.cott.gmail.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; @Service @Component public class UserServiceImpl implements UserService {     @Autowired     Producer producer;     @Override     public List<UserAddress> getAddress(String uesrId) {         producer.sendMsg();         UserAddress userAddress1 = new UserAddress();         userAddress1.setId(1);         userAddress1.setUserAddress("1");         userAddress1.setUserId("1");         UserAddress userAddress2 = new UserAddress();         userAddress2.setId(2);         userAddress2.setUserAddress("2");         userAddress2.setUserId("2");         return Arrays.asList(userAddress1, userAddress2);     } }

3.消费者

pom.xml中引入RabbitMQ依赖

 
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-amqp</artifactId>   <version>1.3.5.RELEASE</version> </dependency>

配置RabbitMQ服务端信息,和交换机以及队列名称

application.yml

 
spring:   rabbitmq:     port: 5672     username: admin     password: admin     host: 192.168.200.128     virtual-host: / order:   fanout:     exchange: order.fanout.exchange     queue: order.fanout.queue

@RabbitListener注解,绑定队列,交换机,以及选择交换模式FANOUT

  • @RabbitListener 可以标注在类上面,需配合 @RabbitHandler 注解一起使用
  • @RabbitListener 标注在类上面表示当有收到消息的时候,就交给 @RabbitHandler 的方法处理,具体使用哪个方法处理,根据 MessageConverter 转换后的参数类型

Consumer.java(消费者)

 
package com.cott.gmail.bootorderserviceconsumer.service.impl; import org.springframework.amqp.core.ExchangeTypes; import org.springframework.amqp.rabbit.annotation.*; import org.springframework.stereotype.Component; @Component @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "${order.fanout.queue}", autoDelete = "true"), exchange = @Exchange(value = "${order.fanout.exchange}", type = ExchangeTypes.FANOUT))) public class Consumer {     @RabbitHandler     public void processMessage(String msg) {         System.out.format("Receiving Message: -----[%s]----- n.", msg);     } }

消费者中有调用生产者getAddress()的方法,生产者向MQ中发送一条消息,同时消费者监听MQ,消费消息。

OrderServiceImpl.java

 
package com.cott.gmail.bootorderserviceconsumer.service.impl; import com.alibaba.dubbo.config.annotation.Reference; import com.cott.gmail.bean.UserAddress; import com.cott.gmail.service.OrderService; import com.cott.gmail.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class OrderServiceImpl implements OrderService {     @Reference     UserService userService;     @Override     public List<UserAddress> initOrder(String id) {         System.out.println("id= " + id);         List<UserAddress> list = userService.getAddress("1");         for (UserAddress user : list         ) {             System.out.println(user.getUserAddress());         }         return list;     } }

4.验证

先后启动生产者和消费者,在浏览器发起请求

消费者控制台输出

同时在RabbitMQ控制台查看监控日志

猜你喜欢

转载自blog.csdn.net/mrchaochao/article/details/106836674