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