Spring Boot 使用RabbitMQ的实例

目标

Publisher将Json消息发送至RabbitMQ中,
Comsumer能够将RabbitMQ中的消息自动映射成对应的Java POJO。

准备

使用docker-compose迅速运行RabbitMQ。

1
2
3
4
5
rabbitmq:
image: rabbitmq:management
ports:
- "5672:5672"
- "15672:15672"

添加spring-boot-starter-amqp

1
2
3
4
5
6
7
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-amqp'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.springframework.amqp:spring-rabbit-test'
}

添加AMQP的Java Configuration。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@EnableRabbit
public class AmqpConf implements RabbitListenerConfigurer {

@Bean
public MappingJackson2MessageConverter jackson2Converter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
return converter;
}

@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setMessageConverter(jackson2Converter());
return factory;
}

@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}

}

添加Message Listener。

1
2
3
4
5
6
7
8
9
10
class Receiver {
@RabbitListener(queues = "queue")
public void receiveMessage(Foo foo) {
System.out.println("Received <" + foo.name + ">");
}
}

class Foo {
public String name;
}

解说

mappingJackson2MessageConverter能将接受到的Quque中的Message转换成对应的POJO。

Spring使用PayloadArgumentResolver去提取,转换Message为对应标记@RabbitListener Method中的Parameter。

我们需要自己实现一个RabbitListenerConfigurer,将Message converter设置成mappingJackson2MessageConverter。

具体参考这里