Spring集成RabbitMQ-接收消息
上篇介绍了有关Spring-AMQP发送消息的机制和方法。既然有发送消息,那么就有接收消息,相比发送端只是埋头一通发送,接收端在接收消息的时候要稍稍复杂一些,这边就来说说有关接收消息。
接收消息
接收消息的方式有两种,一种是较为简单的方法,通过同步的方式去poll消息。另外一种是较为复杂的异步接收消息的方式,通过注册监听器根据需要接收消息。
同步接收消息
-
这种方式,我们只要使用amqpTemplate接口就能实现。
-
这种方法,默认情况下,如果没有消息,那么就会直接返回null,不会有阻塞
-
从1.5版本之后,你就可以通过设置receiveTimeout超时参数,这样就会一直阻塞等receiveTimeout这么长时间,如果该参数设置为0,表示会一直阻塞
接收消息的方法有如下这些
image.png-
第二个方法指定了接收那个Queue的消息
-
第三个方法设置了超时时间
-
最后一个方法同事设置了Queue的名称以及超时时间
有人会问了,我们接收到的消息不一定都是封装成Message形式的,我们想直接接收我们定义的类形式的消息,有这样的方法么? 有的,下面的这些方法就能实现你们想要的功能
image.png比较上面的receive的方法,这里返回的是Object对象。
从2.0版本之后,还可以通过ParameterizedTypeReference参数来帮你转成你想要的复杂的消息类型
这还没完,我们还可以通过下面的一些方法实现接收完消息并发回回调消息
image.png可以通过ReceiveAndReplyCallback封装要返回的消息
当然你也可以根据业务需求将ReceiveAndReplyCallback赋值为null,这时候与方法receive等效
下面就是使用receiveAndReply方法的例子
image.png异步接收消息
*如果你在实际工作中用到了Spring-AMQP,那么对于上面的同步方式用的应该不多,但是对于即将要介绍的异步方式一定格外亲切熟悉,通过注册一个监听器,当等到消息来的时候,就会回调接口中的回调方法消费消息。
-
Spring-AMQP支持基于注解的方式使用监听类@RabbitListener实现异步接收消息
-
这时候不再像同步那样使用的是amqpTemplate里的方法,而是有另外一套组件,一套消息消费回调的容器
-
实现MessageListener接口就是其中最简单的一种方式,下面就是消息达到时回调onMessage方法的例子
如果你不想在实现你的业务逻辑时与messaging API有那么死板的绑定,也行,你可以使用适配器模式
image.png上面说到的容器,实际上我们设置的监听类是需要注册到这个容器上的。下面我们来看看SimpleMessageListenerContainer,当然除了这个还有一个DirectMessageListenerContainer
image.png指定容器中的监听器的配置,我们可以用非常熟悉的XML的配置方法
image.png下面是一个较为完整的从ConnectionFactory到container再到listener之间的绑定关系样例代码
image.png如果您觉得阅读本文对您有帮助,请点一下“喜欢”按钮,您的“喜欢”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。