美文网首页RabbitMQ
Spring集成RabbitMQ-接收消息

Spring集成RabbitMQ-接收消息

作者: Jackie_Zheng | 来源:发表于2017-08-16 23:03 被阅读98次

    上篇介绍了有关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方法的例子

    image.png

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

    image.png

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

    image.png

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

    image.png

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

    image.png

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

    相关文章

      网友评论

        本文标题:Spring集成RabbitMQ-接收消息

        本文链接:https://www.haomeiwen.com/subject/bqiwrxtx.html