只要安装了RabbitMQ服务器,并创建了使用消息服务的用户,在Spring Boot中就可以很轻易地使用MQ消息服务。
使用RabbitMQ的原理可用下图简单地描述:
即消息生产者发布消息到RabbitMQ服务器,消息消费者从RabbitMQ中接收消息。
下面使用Spring Boot的体系组件云应用开发工具spring-cloud-stream演示如何轻易地使用MQ消息。
首先创建消息生产者和消息消费者工程或模块,并引用spring-cloud-stream-rabbitmq依赖,如下所示:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
</dependencies>
在消息生产者工程中,编辑主程序,如下所示:
@EnableBinding(Source.class)
@RestController
@SpringBootApplication
public class SenderApplication {
@Autowired
@Output(Source.OUTPUT)
private MessageChannel channel;
@RequestMapping(method = RequestMethod.POST, path = "/send")
public void write (@RequestBody Map<String, Object> msg){
channel.send(MessageBuilder.withPayload(msg).build());
}
public static void main(String[] args) {
SpringApplication.run(SenderApplication.class, args);
}
}
即使用MessageChannel来发布消息。同时编辑工程配置,如下所示:
server:
port: 80
spring:
cloud:
stream:
bindings:
output:
destination: cloud-stream
rabbitmq:
addresses: amqp://192.168.1.211:5672
username: mqdemo
password: mq1234
即将服务端口设为80,并设置了stream的目标和连接RabbitMQ的地址和用户。
其次,在消息消费者工程中,编辑主程序,如下所示:
@EnableBinding(Sink.class)
@IntegrationComponentScan
@MessageEndpoint
@SpringBootApplication
public class ReceiverApplication {
@ServiceActivator(inputChannel=Sink.INPUT)
public void accept(Map<String, Object> msg){
System.out.println(msg.get("msg").toString() + ":" + msg.get("name"));
}
public static void main(String[] args) {
SpringApplication.run(ReceiverApplication.class, args);
}
}
即使用Sink来接收消息。同样也要编辑工程的配置,如下所示:
server:
port: 81
spring:
cloud:
stream:
bindings:
input:
destination: cloud-stream
group: group1
consumer:
durableSubscription: true
rabbitmq:
addresses: amqp://192.168.1.211:5672
username: mqdemo
password: mq1234
即将服务端口设为81,如果在不同机器上启动工程也可设为80,并配置了RabbitMQ。
现在,就可以使用Post方式在消息生产者中发布消息了。如果你使用过MQ,可能会有疑问,我们还未在MQ服务器中配置通道和队列呢?不过,这个工作已经由stream代劳了,不再需要我们配置。
最后,开始测试,启动两个工程,在MQ服务器中可以看到增加了两个连接,如下所示:
这时,如果在消息生产者中发布消息,在消息消费者中就能收到消息。为了简便起见,我们使用如下指令给消息生产者发送Pose请求,即通过/send发布消息:
curl -l -H "Content-type:application/json" -X POST -d '{"msg":"Hello","name":"RabbitMQ"}' http://localhost/send
注意,上面指令,需在Linux环境中执行。如果请求成功,在消息消费者的控制台日志输出中就可以看到如下消息:
Hello:RabbitMQ