RabbitMQ学习
参考:https://www.jianshu.com/p/6b62a0ed2491
消息队列:目前流行的有 Kafka、RabbitMQ、ActiveMQ等
功能:为了解决消息的分布式消费,完成项目、服务之间的解耦动作。消息的生产者与消费者之间完全采用异步通信方式,极大的提高了系统的响应能力,从而提高系统的网络请求吞吐量。
Spring-Boot 整合RabbitMQ
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
RabbitMQ:跨平台的分布式消息队列服务,可以部署在任意的操作系统上。需要Erlang环境的支持,需要安装Erlang 和 RabbitMQ
RabbitMQ中有三种常用的转发方式:
1.DirectExchange:路由键方式转发消息
2.FanoutExchange:广播方式转发消息
3.TopicExchange: 主题匹配方式转发消息
DirectExchange:消息被生产者发送至RabbitMQ会携带一个路由键Key,RabbitMQ会将该消息转发,只有路由键为Key的队列消费者会完成消息的消费过程。
几个重要的类:
RabbitTemplate.ConfirmCallback:用来回调消息发送成功后的方法,当一个消息被成功写入RabbitMQ服务端时,就会自动回调RabbitTemplate.ConfirmCallback接口内的confirm方法完成通知。
两个配置信息:
队列的交换信息 ExchangeEnum
@Getter
public enum ExchangeEnum {
USER_REGISTER("user.register.topic.exchange");
private String value;
ExchangeEnum(String value){
this.value = value;
}
}
队列路由信息 QueueEnum
@Getter
public enum QueueEnum {
/**
* 用户注册枚举
*/
USER_REGISTER("user.register.queue","user.register");
/**
* 队列名称
*/
private String name;
/**
* 队列路由键
*/
private String routingKey;
QueueEnum(String name,String routingKey){
this.name = name;
this.routingKey = routingKey;
}
}
用户注册消息队列配置
@Configuration
public class UserRegisterQueueConfiguration {
/**
* 配置路由交换对象实例
*/
@Bean
public DirectExchange userRegisterDirectExchange(){
return new DirectExchange(ExchangeEnum.USER_REGISTER.getValue());
}
/**
* 配置用户注册队列对象实例
* 并设置持久化队列
*/
@Bean
public Queue userRegisterQueue(){
return new Queue(QueueEnum.USER_REGISTER.getName(),true);
}
/**
* 将用户注册队列绑定到路由交换配置上并设置指定路由键进行转发
*
*/
@Bean
public Binding userRegisterBinding(){
return BindingBuilder
.bind(userRegisterQueue()).to(userRegisterDirectExchange()).with(QueueEnum.USER_REGISTER.getRoutingKey());
}
}
配置交换实例:
DirectExchange实例对象,为交换设置名称,消息提供者与消息消费者的交换名称必须一致才可以通讯。
配置队列实例:
Queue实例对象,为消息队列设置名称,生产者与消费者的队列名称也必须一致。
绑定队列实例到交换实例中:
Binding实例对象,将Queue绑定到Exchange上,并通过设置的路由key进行消息转发。配置了路由key后,只有符合该路由的配置的消息才会被妆发到绑定的交换上的消息队列。
生产者:
在业务逻辑完成之后,调用消息发送方法,将消息发送至队列中
消费者:
@Component
@RabbitListener(queues = "user.register.queue")
public class UserRegisterMQ {
@RabbitHandler
public void execute(UserEntity message){
log.error("用户:"+message.toString()+",注册成功");
}
}
两个注解:
@RabbitListener:队列消息监听注解,该注解配置监听queue内的队列名称列表。
@RabbitHandler 消息处理方法,该方法的参数需要与生产者发送消息的类型保持一致,否则无法自动调用消费方法,且无法完成消费。
本文临摹(抄袭)我的偶像 简书:恒宇少年 Spring-Boot 四十一章。
生产者和消费者是两个不同的项目,关于RabbitMQ的配置信息一模一样,两个项目分别启动,消息可以成功接收。
问题:我将消费者打包发给同事,同事无法启动,我们在同一局域网,但是他本地没有安装RabbitMQ,该问题后续定位。。。。。。。。。