Spring集成RabbitMQ-接收消息

上篇介绍了有关Spring-AMQP发送消息的机制和方法。既然有发送消息,那么就有接收消息,相比发送端只是埋头一通发送,接收端在接收消息的时候要稍稍复杂一些,这边就来说说有关接收消息。

接收消息

接收消息的方式有两种,一种是较为简单的方法,通过同步的方式去poll消息。另外一种是较为复杂的异步接收消息的方式,通过注册监听器根据需要接收消息。

同步接收消息

  • 这种方式,我们只要使用amqpTemplate接口就能实现。

  • 这种方法,默认情况下,如果没有消息,那么就会直接返回null,不会有阻塞

  • 从1.5版本之后,你就可以通过设置receiveTimeout超时参数,这样就会一直阻塞等receiveTimeout这么长时间,如果该参数设置为0,表示会一直阻塞

接收消息的方法有如下这些

Spring集成RabbitMQ-接收消息_第1张图片
image.png
  • 第二个方法指定了接收那个Queue的消息

  • 第三个方法设置了超时时间

  • 最后一个方法同事设置了Queue的名称以及超时时间

有人会问了,我们接收到的消息不一定都是封装成Message形式的,我们想直接接收我们定义的类形式的消息,有这样的方法么? 有的,下面的这些方法就能实现你们想要的功能

Spring集成RabbitMQ-接收消息_第2张图片
image.png

比较上面的receive的方法,这里返回的是Object对象。
从2.0版本之后,还可以通过ParameterizedTypeReference参数来帮你转成你想要的复杂的消息类型

这还没完,我们还可以通过下面的一些方法实现接收完消息并发回回调消息

Spring集成RabbitMQ-接收消息_第3张图片
image.png

可以通过ReceiveAndReplyCallback封装要返回的消息

当然你也可以根据业务需求将ReceiveAndReplyCallback赋值为null,这时候与方法receive等效

下面就是使用receiveAndReply方法的例子

Spring集成RabbitMQ-接收消息_第4张图片
image.png

异步接收消息

*如果你在实际工作中用到了Spring-AMQP,那么对于上面的同步方式用的应该不多,但是对于即将要介绍的异步方式一定格外亲切熟悉,通过注册一个监听器,当等到消息来的时候,就会回调接口中的回调方法消费消息。

  • Spring-AMQP支持基于注解的方式使用监听类@RabbitListener实现异步接收消息

  • 这时候不再像同步那样使用的是amqpTemplate里的方法,而是有另外一套组件,一套消息消费回调的容器

  • 实现MessageListener接口就是其中最简单的一种方式,下面就是消息达到时回调onMessage方法的例子

Spring集成RabbitMQ-接收消息_第5张图片
image.png

如果你不想在实现你的业务逻辑时与messaging API有那么死板的绑定,也行,你可以使用适配器模式

image.png

上面说到的容器,实际上我们设置的监听类是需要注册到这个容器上的。下面我们来看看SimpleMessageListenerContainer,当然除了这个还有一个DirectMessageListenerContainer

image.png

指定容器中的监听器的配置,我们可以用非常熟悉的XML的配置方法

image.png

下面是一个较为完整的从ConnectionFactory到container再到listener之间的绑定关系样例代码

Spring集成RabbitMQ-接收消息_第6张图片
image.png

如果您觉得阅读本文对您有帮助,请点一下“喜欢”按钮,您的“喜欢”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

Spring集成RabbitMQ-接收消息_第7张图片

你可能感兴趣的:(Spring集成RabbitMQ-接收消息)