文档章节

SpringMVC中配置RabbitMQ

AlphaGo
 AlphaGo
发布于 2016/03/26 23:24
字数 1225
阅读 2391
收藏 21

        RabbitMQ是工作在amqp协议(advanced message queue protocal,高级消息队列协议)上的一个消息中间件。它通过一个生产者消费者模型来处理应用中产生的消息。

        

        除了生产者和消费者,此模型中另外一个重要的概念叫“工作队列”,也称为“任务队列”(Task Queue),任务队列背后的核心想法是避免立即执行资源密集型的任务并不得不等待它完成,而是将任务封装成消息发送到一个队列中,然后由“消费者”来获取任务并依次执行,当有多个“消费者”的时候,它们会均匀的分配这些任务。默认情况下,RabbitMQ会轮流的将消息发送给“消费者”,这种分发消息的方式被称为“round-robin”。


        RabbitMQ支持“消息确认反馈”来确保消息不会因为“消费者”挂了而丢失——在消息被接收并处理之后,会给RabbitMQ发送一条确认,这样RabbitMQ就能将该消息删掉。如果没有收到确认,RabbitMQ会重发这条消息。RabbitMQ还支持消息持久化,来保证当RabbitMQ服务停止时消息不会丢失,这种情况下,RabbitMQ会将消息写到硬盘。


        发布/订阅模式——消息会被发送到所有它的“订阅者”

        Exchange,完整的RabbitMQ模型中还包含一个消息交换机。消息生产者先将消息发送给交换机,然后交换机再将消息发送给队列。交换机有一个属性叫exchange type能决定如何处理消息,比如是否该把一条消息推送给某一个队列或是某多个队列,还是应该把它丢弃掉。其属性值有:direct,topic,headers,fanout。

        exchange和队列之间的关系称为“binding”(它们之间有个binging key),消息会被路由到由其"routingKey"属性指定名称的队列中,如果没有队列绑定到exchange上,消息将会丢失。

        fanout exchange会把它接收到的消息广播到所有的队列,而direct exchange会匹配消息的routing key和队列的bingding key,然后将消息发送到与之匹配成功的队列上。没有匹配的消息将被丢弃。

        topic exchange,被发送到topic exchange的消息不能被指定一个随意的routing key,它必须是一个由"."分隔的单词的清单,这些单词通常指定了消息的某些特征,如"quick.orange.rabbit",单词数量的上限是255个字节。bingding key必须也是同样的形式,和direct exchange一样,带有特定routing key的消息会被发送到带有匹配bingding key的队列上,但是bingding key有两个重要的特点,"*"号可以代替一个单词,"#"可以代替0个或者多个单词,例如,"*.orange.*"的binding key会匹配所有routing key中第二个单词为orange的消息,而bingding key:"#"会匹配所有的消息。


        结合实际项目中的代码,看看如何在SpringMVC中配置RabbitMQ。

        通常会从Spring的配置文件中单独引出一个RabbitMQ的配置文件application-rabbit-context.xml,并将该配置文件中需要用到的一些参数值通过rabbit.properties配置文件单独配置。

        在pom中,会引入一个将Spring与RabbitMQ整合的依赖:

<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
</dependency>

        它会提供一个RabbitMQ Java Client来提供服务。然后我们要配置一个connect-factory,它里面定义了连接的主机、端口、用户名和密码等信息。(连接工厂创建连接,连接创建channel,channel声明队列,队列接收/发送消息)

<rabbit:connection-factory 
    id="connectionFactory"
    host="${rabbit.connect.host}" 
    port="${rabbit.connect.port}"
    username="${rabbit.connect.username}" 
    password="${rabbit.connect.password}"
    channel-cache-size="${rabbit.connect.channelCacheSize}"
    publisher-returns="true" 
    publisher-confirms="true" />

        接下来是配置一个消息转换器,用来将消息转换为Json,方便消息在生产者和消费者之间传输。

<bean id="messageConverter"
    class="org.springframework.amqp.support.converter.SimpleMessageConverter" />

        然后会定义一个<rabbit:admin />,它的作用是在系统启动时自动得到exchange和queue的bean,并将它们在容器中注册。

        然后是生产者和消费者的定义,生产者会通过一个template发送消息,配置如下:

<rabbit:template id="rabbitTemplate"
    connection-factory="connectionFactory" message-converter="messageConverter" />

        配置消费者通常是配置一个queue,一个listener和一个listener container:

<rabbit:queue id="TagRequestQueue" name="optag.request.queue" />
  
<bean id="TagRequestListener" class="com.ximalaya.tagging.backend.listener.TagRequestListener" />
  
<rabbit:listener-container
    connection-factory="connectionFactory" message-converter="messageConverter">
    <rabbit:listener ref="TagRequestListener" queues="TagRequestQueue" />
</rabbit:listener-container>

        以上就完成了Spring中RabbitMQ的配置,在发送和接受消息的代码实现上,发送消息的类方法中会通过template的convertAndSend方法将消息对象发送出去,而消息接收类则通过实现MessageListener接口并重写其onMessage方法接收消息并做相应的处理。

        


        


        


                

        

© 著作权归作者所有

AlphaGo
粉丝 0
博文 9
码字总数 7769
作品 0
程序员
私信 提问
阿里云Kubernetes SpringCloud 实践进行时(2): 分布式配置管理

简介 为了更好地支撑日益增长的庞大业务量,我们常常需要把服务进行整合、拆分,使我们的服务不仅能通过集群部署抵挡流量的冲击,又能根据业务在其上进行灵活的扩展。随着分布式的普及、服务...

osswangxining
2018/05/25
0
0
Spring Boot RabbitMQ 优先级队列

Docker With RabbitMQ 官方 Docker 镜像仓库地址 https://hub.docker.com/_/rabbitmq 本地运行 RabbitMQ 访问可视化面板 地址:http://127.0.0.1:15672/ 默认账号:guest 默认密码:guest S...

Anoyi
02/23
0
0
RabbitMQ 入门 与 RabbitMQ 在 Spring Boot 中的使用

Message Broker与AMQP简介 Message Broker是一种消息验证、传输、路由的架构模式,其设计目标主要应用于下面这些场景: 消息路由到一个或多个目的地 消息转化为其他的表现方式 执行消息的聚集...

Anur
2018/09/13
442
0
通过实例理解 RabbitMQ 的基本概念

先说下自己开发的实例。 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置,并不能实时读取...

xumaojun
2018/05/06
0
0
(八)Java B2B2C o2o多用户商城 springcloud架构-消息总线(Spring Cloud Bus)

Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置...

sccspuercode
02/18
19
1

没有更多内容

加载失败,请刷新页面

加载更多

Kylin构建Cube过程详解

1 前言 在使用Kylin的时候,最重要的一步就是创建cube的模型定义,即指定度量和维度以及一些附加信息,然后对cube进行build,当然我们也可以根据原始表中的某一个string字段(这个字段的格式...

大数据技术进阶
6分钟前
3
0
Git保存密码

保存密码 $ git config --global credential.helper store 参数 --global 设置全局,如果用 --local 则只设置当前库 要注意保存时是用明文保存的,所以不要在公用电脑使用...

编程老陆
8分钟前
4
0
ofcms 说明文档

一、模板说明 项目概述 java 版CMS系统、基于java技术研发的内容管理系统、功能:栏目模板自定义、内容模型自定义、多个站点管理、在线模板页面编辑等功能、代码完全开源、MIT授权协议。 技术...

kuchawyz
15分钟前
3
0
理解CSS相对定位和固定定位

本文转载于:专业的前端网站➦理解CSS相对定位和固定定位 前面的话   一般地,说起定位元素是指position不为static的元素,包括relative、absolute和fixed。前面已经详细介绍过absolute绝对...

前端老手
25分钟前
3
0
iOS Xcode升级包地址(感谢大神)

下载地址:DeviceSupport

_____1____
39分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部