环境:
Spring Cloud 2020.0.3
Windows 10
RabbitMQ server 3.7.14https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exeErlang 21.3http://erlang.org/download/otp_win64_21.3.exe
最近在写一个订单系统
基本流程:用户发起订单请求----订单服务把消息推送到交换机----用户服务余额与商品服务库存进行消费----生成订单,使用分布式事务和Rabbit ACK机制确保订单下单成功
下面仅讨论基本使用,手动创建队列,你也通过配置在运行时进行创建
首先进入localhost:15672 默认账户密码都是 guest
创建项目使用的账户,如果你要使用默认的guest账户,可以跳过这步
设置用户权限
创建虚拟地址
创建交换机
创建队列
把所有队列都绑定交换机
项目配置
依赖和yml每个服务都是一样的,记住我们上面配的各种名字
<!-- rabbitMq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
spring:
rabbitmq:
host: localhost
port: 5672
username: bugo
password: 123
virtual-host: /order
生产者
/**
* 消息发送者 - Producer。
* @Component Producer类型的对象,必须交由Spring容器管理。
* 使用SpringBoot提供的AMQP启动器,来访问rabbitmq的时候,都是通过AmqpTemplate来实现的。
* 如果全局配置文件中,配置了rabbitmq相关内容,且工程依赖了starter-amqp,则spring容器自动创建AmqpTemplate对象。
*/
@Component
public class BugoOrdersSender {
@Autowired
private AmqpTemplate rabbitAmqpTemplate;
//exchange 交换器名称
// @Value("${mq.config.exchange}")
private String exchange = "order.fanout";
//routingkey 路由键
// @Value("${mq.config.queue.info.routing.key}")
private String routingKey = "order.fanout";
/*
* 发送消息的方法
*/
public void send(RocketOrdersDto msg){
/**
* convertAndSend - 转换并发送消息的template方法。
* 是将传入的普通java对象,转换为rabbitmq中需要的message类型对象,并发送消息到rabbitmq中。
* 参数一:交换器名称。 类型是String
* 参数二:路由键。 类型是String
* 参数三:消息,是要发送的消息内容对象。类型是Object
*/
this.rabbitAmqpTemplate.convertAndSend(this.exchange, this.routingKey, msg);
}
}
每个需要消费的服务都需要配置接收者
@Component
@RabbitListener(
queues = "order.wallet"
)
public class BugoOrdersReceiver {
/**
* 消费消息的方法。采用消息队列监听机制
* @RabbitHandler - 代表当前方法是监听队列状态的方法,就是队列状态发生变化后,执行的消费消息的方法。
* 方法参数。就是处理的消息的数据载体类型。
*/
@RabbitHandler
public void process(RocketOrdersDto msg){
System.out.println("receiver: "+msg);
}
}
在接口中调用生产,接受者就可以接收了
有疑问欢迎评论