up:: SpringCloud之RabbitMQ设计者模式
说明:
使用时机:流量大或者接口调用慢的时候,使用RabbitMQ更好,因为其是异步的。。。
以前使用Feign进行库存返还
是在取消订单操作的时候:
现在改用RabbitMQ设计模式,弄清楚谁是生产者,谁是消费者。
正式使用MQ开发返还库存功能
引入依赖
我们下单是在订单模块,在此模块添加MQ的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
同理,消费者商品模块也需要添加此依赖。。。
我们生产者是订单模块,消费者是商品模块。。。
添加配置
spring.rabbitmq.addresses=127.0.0.1:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
同理,生产者与消费者模块都要添加此配置。
接下来开发交换机与队列
配置MQ的交换机和队列
package com.imooc.cloud.mall.practice.cartorder.mq;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitMQ配置类
*/
@Configuration
public class MQConfig {
@Bean
public Queue queue1(){
return new Queue("queue1");
}
@Bean
DirectExchange exchange(){
return new DirectExchange("cloudExchange");
}
@Bean
Binding bindingExchangeMessage (Queue queue1,DirectExchange exchange){
return BindingBuilder.bind(queue1).to(exchange).with("productStock");
}
}
说明:
注意:这里Queue的导包问题,不是Java.util的包。。。。
路由键什么玩意?
交换器根据消息携带的路由键,来决定消息交给哪个队列。交换机根据这个绑定规则来交给队列以后,消费者就可以连接队列取出消息。 单播模式根据路由键把消息派发到一个指定队列。 广播模式不管路由键,将消息派发给对应的绑定了交换器的所有消息队列。 topic模式是根据路由键的规则匹配,有选择性的进行广播。 Routing Key就是路由规则,消息对应的队列。路由键来规定。 SpringBoot整合RabbitMQ之Fanout Exchange扇形(广播式)交换机(学习总结)-CSDN博客 首先:路由键需要用在在交换机和队列创建之后的相互绑定。 其次:发布数据的时候需要在某个交换机里面填写路由键,然后写上要发送的消息内容。 最后:路由键就可以找到被绑定的相应的队列来接收消息,get message那个就可以接收消息,然后里面同样看得到路由键和交换机。
可继续参考rabbitmq的routingkey的作用_张超帅的博客-CSDN博客_routingkey
配置生产者,发送消息
package com.imooc.cloud.mall.practice.cartorder.mq;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 发送消息
*/
@Component
public class MsgSender {
@Autowired
private AmqpTemplate rabbitmqTemplate;
public void send(Integer productId,Integer stock){
rabbitmqTemplate.convertAndSend("cloudExchange","productStock",productId+","+stock);
}
}
说明:
利用rabbitTemplate(import org.springframework.amqp.rabbit.core.RabbitTemplate;需要在pom.xml中导入amqp的依赖)的convertAndSend方法就可以发送。
配置消费者,接收消息
来到商品模块,新建消费者类:
package com.imooc.cloud.mall.practice.categoryproduct.mq;
import com.imooc.cloud.mall.practice.categoryproduct.model.pojo.Product;
import com.imooc.cloud.mall.practice.categoryproduct.service.ProductService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 接收消息
*/
@Component
@RabbitListener(queues="queue1")
public class Receiver {
@Autowired
ProductService productService;
@RabbitHandler
public void process(String message){
System.out.println("收到了"+message);
String[] split = message.split(",");
productService.updateStock(Integer.valueOf(split[0]),Integer.valueOf(split[1]));
}
}
说明:
生产者更新库存
开始测试
大坑: guest只能从127.0.0.1使用,我们使用的是虚拟机里的RabbitMQ服务,所以改掉用户名和密码,用户名为admin,密码为password