一、工程准备
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
Spring-boot提供的rabbitMQ启动器
- 添加rabbitMQ连接配置
spring:
application:
name: consumer
rabbitmq:
host: 192.168.0.1
port: 5672
username: zhangsan
password: 123456
virtual-host: / #虚拟主机名字
listener:
simple:
prefetch: 1 #每次从队列中获取一条,处理完后才能获取到下一条
- 生产者自定义MessageConverter
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的。而默认实现是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。修改只需要定义一个MessageConverter 类型的Bean即可,推荐用JSON方式序列化。
自定义MessageConverter是为了更改content_type类型,原始是application/x-java-serialized-object,可读性差,并且所传输的字节量也比较大。
引入fastjson后,重新自定义MessageConverter,使传输类型成为application/json,提高可读性和减少传输字节量,提高性能。
二、选定交换机类型
- Fanout exchange 广播型
- Direct exchang 路由型
- Topic exchang 主题型
1、Fanout exchange广播型
顾名思义,就是将生产者的消息转发给所有绑定该交换机的队列。
生产者:
public void sendFanoutExchange() {
String exchangeName = "fanout.exchange";
String message = "hello,everyone!";
rabbitTemplate.convertAndSend(exchangeName, "", message);
}
消费者:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "fanout.queue"),
exchange = @Exchange(name = "fanout.exchange", type = ExchangeTypes.FANOUT)
))
public void rabbitFanoutListener(String message) {
System.out.println("接受到fanout消息:" + message);
}
2、Direct exchang 路由型
生产者:
public void sendDirectExchange() {
String exchangeName = "direct.exchange";
String message = "hello,blue!";
rabbitTemplate.convertAndSend(exchangeName, "blue", message);
}
消费者:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue"),
exchange = @Exchange(name = "direct.exchange", type = ExchangeTypes.DIRECT),
key = {"blue"}
))
public void rabbitDiRectListener(String message) {
System.out.println("接受到消息:" + message);
}
3、Topic exchange 主题型
生产者:
public void sendTopicExchange() {
String exchangeName = "topic.exchange";
String message = "hello,news!";
rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
}
消费者:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic.queue"),
exchange = @Exchange(name = "topic.exchange",type = ExchangeTypes.TOPIC),
key = "#.news"
))
public void rabbitTopicListening(String message) {
System.out.println("接受到消息:" + message);
}