第一步:
每个参与的服务都要导入 amqp 的依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
为了方便也可以导入到父模块或 commom 的 pom 文件中
第二步:
配置文件中指定 MQ 的配置
spring:
rabbitmq:
host: 192.168.138.100 # 你的虚拟机IP
port: 5672 # 端口
virtual-host: /heima # 虚拟主机
username: heima84 # 用户名
password: 123321 # 密码
virtual-host :
通过 IP : 15672 访问即可登录查看
第三步
到公共模块 commom 中书写消息转换器,因为接收方都需要,所以方 commom 中更方便
@Configuration
public class MqConfig {
@Bean
public MessageConverter jackson2MessageConverter() {
return new Jackson2JsonMessageConverter();
}
}
第四步
1、让 item 和 cart 作为消费者绑定路由的 topic 接收消息。分别在两个服务中书写监听器绑定 topic
@Component
@Slf4j
@RequiredArgsConstructor
public class SpringRabbitListener {
private final ICartService cartService;
@RabbitListener(bindings = {@QueueBinding(
//声明消息队列,并指定持久化
value = @Queue(value = "mark.cart.queue", durable = "true"),
//声明消息交换机,并指定类型为topic
exchange = @Exchange(value = "order.topic", type = ExchangeTypes.TOPIC),
//指定消息如何从交换机路由到队列(这里是路由键)
key = "order.success"
)
}
)
//注意参数的类型与消费者发送的一致或兼容即可
public void handleObjectQueueMessage(Set<Long> itemIds) {
log.info("====================={}", itemIds);
cartService.removeByItemIds(itemIds);
}
}
因为 Item 也接收同一个生产者 order,所以只需要改变一下队列名称即可,保持 key 的一致。
2、 让 order 作为生产者生产消息
注入 rabbitMQ 之后生产消息
try {
rabbitTemplate.convertAndSend("order.topic", "order.success", order.getId());
} catch (Exception e) {
throw new RuntimeException("库存不足!");
}
exchange 交换机的名称
order.success 路由的键,也就是监听器的中写的 key
order.getId() 为传输的数据,这里可以依照业务自由决定