温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringMVC消费RabbitMQ队列的示例分析

发布时间:2021-09-10 14:21:32 来源:亿速云 阅读:151 作者:小新 栏目:编程语言

这篇文章将为大家详细讲解有关SpringMVC消费RabbitMQ队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.环境介绍

  • Jdk1.8.0_202

  • Spring 4.3.9.RELEASE

  • spring-webmvc 4.3.9.RELEASE

2.添加Maven依赖

<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>

3.添加RabbitMQ配置

在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

4.创建RabbitMQ配置文件

新建 applicationContext-rabbitmq.xml

SpringMVC消费RabbitMQ队列的示例分析

内容如下
<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>

5.创建监听器消费者

创建与ref="plateNumRabbitConsumer"对应的消费者类,必须添加注解@Component加入Spring管理,实例名可自定义,但必须与ref关联的名字一致;消费者类必须实现MessageListener,监听队列的变化,实现实时消费;

SpringMVC消费RabbitMQ队列的示例分析

遇到的问题

  • 同一个项目中若同时存在生产者和消费者,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队列的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI