通信
同步通信:就相当于打电话,双方交互是实时的。同一时刻,只能与一人交互。
异步通信:就相当于发短信,双方交互不是实时的。不需要立刻回应对方,可以多线程操作,跟不同人同时聊天。
RabbitMQ
过程
几个基础概念
publisher:生产者,发送消息的一方
consumer:消费者消费消息的一方
queue:队列,存储消息。生产者投递的消息会暂时存储在消息队列中,等待消费者消费。
exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。
virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的交换机,队列。
RabbitMQ框架
某个虚拟主机,生产者发送消息到交换机,再由交换机发送消息到队列,队列把消息推送给消费者。
SpringAMQP
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>配置说明
spring:
rabbitmq:
host: 192.168.32.130 # 你的虚拟机IP
port: 5672 # 端口
virtual-host: /hm # 虚拟主机
username: lxs # 用户名
password: 123456 # 密码
listener:
simple:
prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息
交换机说明
Fanout
Fanout交换机(广播)会将消息路由到每个绑定队列中。
Direct
Direct交换机不再把消息交给每一个绑定的队列,而是根据消息的
Routing Key
进行判断,只有队列的
Routingkey
与消息的
Routing key
完全一致,才会接收到消息
Topic
Topic
类型的
Exchange
与
Direct
相比,都是可以根据
RoutingKey
把消息路由到不同的队列。
只不过
Topic
类型
Exchange
可以让队列在绑定
BindingKey
的时候使用通配符!
通配符规则
#
:匹配一个或多个词*
:匹配不多不少恰好1个
举例:
item.#
:能够匹配item.spu.insert
或者item.spu
item.*
:只能匹配item.spu
消息转换器
默认情况下Spring采用的序列化方式是JDK序列化。
配置JSON转换器
依赖<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.10</version> </dependency>
配置类
@Bean
public MessageConverter messageConverter(){
// 1.定义消息转换器
Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
// 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
jackson2JsonMessageConverter.setCreateMessageIds(true);
return jackson2JsonMessageConverter;
}
例子
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(name = "topic.queue2"),
exchange = @Exchange(name = "hm.topic", type = ExchangeTypes.TOPIC),
key = "ch.*"
)
)
public void TopicQueueC(String a) {
System.out.println("topic.queue2 ch.*" + a);
}
版权归原作者 禾日香 所有, 如有侵权,请联系我们删除。