String boot+ RabbitMQ初探
介绍
RabbitMQ是一款开源的AMQP消息中间件,支持并发数可达10万级。关于RabbitMq详细介绍以及安装,可以参考官网:RabbitMQ。
RabbitMQ、Spring Framework都由Privotal公司开发,Spring Framework已有对RabbitMQ的实现,Spring官方提供集成RabbitMQ的教程:Messaging with RabbitMQ。本文在官方教程的基础上,继续探索在如何spring boot使用rabbitmq。
RabbitMQ简介
AMQP报文格式
RabbitMQ基于AMQP协议,该协议定于报文格式如下:
MessageProperties{
header // 报文头,Map类型
Properties // 属性,多个key-value对
}
Body //消息内容
RabbitMQ如何提供消息队列功能
每一个RabbitMQ服务器提供exchange和queue等组件。当发送消息时,消息生产者将消息包文以及routing key先发送给exchange组件。Exchange组件在不同类型下,汇根据routing key或报文header寻找合适的queue,并将报文传到queue中。queue同exchange需要预先根据规则(稍后介绍)绑定了,才能被exchange找到。消息消费者监听某一个queue,并从queue中拿出消息进行处理。
同一个exchange可以根据不同规则绑定多个queue,并可以(根据规则定义)将同一条消息同时转发不同queue。多个消费者可以监听同一个queue并获取消息,但同一个queue中的每一条消息只会被消费(获取)一次,不会重复消费。
Exchange与Queue绑定
Queue组件需要预先同Exchange绑定。Exchange有四种类型:fanout、direct、topic和headers。其中fanout、direct和topic三种类型根据routing key将报文路由到适合的queue;headers类型根据header路由。fanout和direct类型的功能可以完全永topic类型实现。本文只介绍topic类型Exchange的使用;如对其他类型感兴趣,请参考RabbitMQ官方的介绍。
Queue绑定Topic类型Exchange时需要同时指定binding key作为路由判断依据。消息生产者发送消息报文同时发送消息routing key给exchange,exchange会将消息转到所有binding key与routing key匹配的queue中。binding key和routing key最大长度255字节,并由"."分隔单词,如stock.hk.hsbc。binding key中“*”字符被定义为匹配一个单词,“#”字符被定义匹配一个或多个连续单词。例如stock.hk.hsbc匹配下列binding key:
stock.hk.hsbc
stock.hk.*
*.hk.\*
stock.hk.#
stock.#
但是不匹配:
stock.*
RabbitMQ管理界面
RabbitMQ提供管理界面插件,默认通过http://localhost:15672访问,默认用户名guest,密码guest。有关管理界面详细信息,可参考Management Plugin。
Spring Boot使用RabbitMQ
Spring Framework已集成使用RabbitMQ收发消息的全部功能。Spring官方文档提供了简单的使用方式;这里探索其他的方法使用RabbitMQ。
使用注解
Spring提供针对AMQP的注解。使用@RabbitListener注解创建并绑定exchange和queue,并方法连接消息接受方法和queue:
@RabbitListener(
bindings = @QueueBinding(
exchange = @Exchange(value = Application.topicExchangeName, type = ExchangeTypes.TOPIC, autoDelete = "true"),
value = @Queue(value = "spring-boot", autoDelete = "true"),
key = "foo.bar.#"
)
)
public void receiveMessage(String message) {
System.out.println("Received <" + message + ">");
}
<