这篇文章将为大家详细讲解有关SpringMVC消费RabbitMQ队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
Jdk1.8.0_202
Spring 4.3.9.RELEASE
spring-webmvc 4.3.9.RELEASE
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.6.0</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-amqp</artifactId> <version>2.0.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>2.0.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.4.RELEASE</version> </dependency>
在jdbc.properties文件中加入RabbitMQ地址端口用户密码等信息
#RabbitMQ地址 mq_host=127.0.0.1 #RabbitMQ端口 mq_port=5672 #RabbitMQ虚拟主机 mq_virtual_host=/ #RabbitMQ用户名 mq_username=admin #RabbitMQ密码 mq_password=your rabbitmq password
新建 applicationContext-rabbitmq.xml
内容如下
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-2.0.xsd" > <description>RabbitMQ 连接服务配置</description> <!-- 连接配置 --> <rabbit:connection-factory id="connectionFactory" host="${mq_host}" username="${mq_username}" password="${mq_password}" port="${mq_port}" virtual-host="${mq_virtual_host}"/> <rabbit:admin connection-factory="connectionFactory"/> <!-- rabbit template声明--> <rabbit:template exchange="capture_exchanges" id="amqpTemplate" connection-factory="connectionFactory" message-converter="jsonMessageConverter" /> <!-- 消息对象json转换类 --> <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /> <!-- 申明消息队列Queue --> <!-- durable:是否持久化 exclusive: 仅创建者可以使用的私有队列,断开后自动删除 auto_delete: 当所有消费客户端连接断开后,是否自动删除队列 ignore-declaration-exceptions : [非常重要] 当前队列已经创建,则忽略;消费已有队列时需增加此配置,否则启动报错 --> <!--<rabbit:queue id="mail" name="mail" durable="true" auto-delete="false" exclusive="false" />--> <rabbit:queue id="capture-000001" name="capture-000001" durable="true" ignore-declaration-exceptions="true" auto-delete="false" exclusive="false" /> <!-- 交换机定义 --> <!-- rabbit:direct-exchange:定义exchange模式为direct,意思就是消息与一个特定的路由键完全匹配,才会转发。 rabbit:binding:设置消息queue匹配的key --> <rabbit:direct-exchange name="capture_exchanges" durable="true" auto-delete="false" ignore-declaration-exceptions="true" id="capture_exchanges"> <rabbit:bindings> <!--<rabbit:binding queue="mail" key="mail"/>--> <rabbit:binding queue="capture-000001" key="000001"/> </rabbit:bindings> </rabbit:direct-exchange> <!-- 配置监听 acknowledeg = "manual" 设置手动应答 当消息处理失败时:会一直重发 直到消息处理成功,需要自己手动提交;否则不会继续消费;Auto自动应答,则会继续往下消费 prefetch ="1" 设置消息消费数量,每次从队列中取1条消息;多个监听器公平分发,同一时刻仅有一条消息处理 concurrency = "1" 设置每个listener并发的消费者个数 --> <rabbit:listener-container connection-factory="connectionFactory" transaction-size="1" prefetch="1" concurrency="1" acknowledge="auto" message-converter="jsonMessageConverter" monitor-interval="5000"> <!-- 配置监听器 queues:监听的队列,多个的话用逗号(,)分隔 ref:监听器,需实现监听器接口,@Component加入Spring管理 --> <!--<rabbit:listener queues="mail" ref="mailListener"/>--> <rabbit:listener queues="capture-000001" ref="plateNumRabbitConsumer" /> </rabbit:listener-container> </beans>
创建与ref="plateNumRabbitConsumer"对应的消费者类,必须添加注解@Component加入Spring管理,实例名可自定义,但必须与ref关联的名字一致;消费者类必须实现MessageListener,监听队列的变化,实现实时消费;
同一个项目中若同时存在生产者和消费者,applicationContext-rabbitmq.xml中声明的工厂,路由,队列都无特别注意的地方;生产者需要使用到rabbit:template,消费者不需要此配置即可行
若只需消费队列,在声明队列时,若rabbitmq服务中已创建过同名队列,则必须配置ignore-declaration-exceptions="true",否则项目启动时将报错
监听容器的配置,需注意prefetch="1" 和 acknowledge="auto",prefetch表示单次从队列中消费的数量,prefetch=”1”,说明单次消费1条消息,若容器中配置多个监听器消费,则会公平分发;acknowledge="auto" 表示自动应答,消费完成后回复确认,改消息将从rabbitmq服务中删除,并且会自动消费下一条消息,acknowledge=" manual"表示手动应答 当消息处理失败时:会一直重发 直到消息处理成功,需要自己手动提交;否则不会继续消费;手动应答方式需要配置template的confirm-callback回调方法;
关于“SpringMVC消费RabbitMQ队列的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。