zoukankan      html  css  js  c++  java
  • Spring集成RabbitMQ-必须知道的几个概念

    上篇《Spring集成RabbiMQ-Spring AMQP新特性》我们了解了最新spring-rabbit的2.0.0.M5版本相较于之前有哪些变化。其实使用Spring-amqp确实简单,其主要就一些jar包,比如spring-amqp,spring-rabbit等。这篇就通过几个基本概念来了解下Spring amqp和原生amqp在用法上有何不同。

    消息体

    在《RabbitMQ入门》系列中,我们如果要发送一条消息,都是转成字节数组的,类似这样
    channel.basicPublish("", QUEUE_NAME, null, "hello world".getBytes());
    但是在spring-amqp中,定义了一个消息类,用于存储消息实体和消息的属性信息。下面是该类的成员变量和方法
    3217000081e4d1970e2e

    • getBody就是获取消息体的内容,相当于上面的“hello world”

    • getMessageProperties可以得到有关消息本身的属性信息,比如messageId消息的id标识,timestamp时间戳等等的值

    • 使用这将上面属性的值通过setHeader(String key, Object value)方法添加到消息类中

    Exchange

    读过《RabbitMQ入门》系列,想必对于Exchange应该就不会陌生。在RabbitMQ是实际上所有的消息都不是生产者直接送到消费者,而是需要经过一道Exchange。Exchange接收发送者发送的消息,并根据定好的路由规则将消息派发到相应的队列Queue中去,最终被消息者消费。
    在原生的RabbitMQ中,我们通过类似这样的语句来指定需要使用哪种Exchange类型
    channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
    显然,这里声明的是Fanout的exchange模式。同时,我们注意到这里并没有一个与Exchange直面相关的类,来设置响应的属性。
    在spring-amqp中,就针对Exchange单独定义了一个接口Exchange。
    321e000006c14bae4033

    • 通过方法名,我们就很清楚知道每个方法是干什么的,比如isDurable用于判定是否持久化了

    • getType方法用于得到该Exchange是那种类型,前面我们已经说过,Exchange的类型主要有Direct、Fanout、Topic和Headers四种,相应的,也有四个实现类集成了接口Exchange,他们分别是DirectExchange、FanoutExchange、TopicExchange和HeadersExchange

    下面我们看看DirectExchange和Exchange的关系
    32000000154e69b3bf3a

    • 这四个实现类都是继承了抽象类AbstractExchange,而AbstractExchange也是Exchange的子类。
    • DirectExchange的源码如下,我们可以看到其复写了getType方法,并赋值为ExchangeTypes.DIRECT

    Queue

    Queue是用来存储消息的,消费者从这里拿走消息并消费。与上面提到的Exchange类似,Spring-amqp中也是通过一个类Queue来定义了队列。
    320d00000a45a5a469f8

    • Queue有多种重载形式的构造函数,可以设置queue的名称,是否持久化,是否自动删除等等

    • 有一些判断的函数,比如是否持久化了,是否设置了自动删除等

    Binding

    我们应该还记得在原生的RabbitMQ中,Fanout模式下是如何绑定Exchange和Queue的
    channel.queueBind(queueName, EXCHANGE_NAME, "");
    在Spring-amqp中,即使是绑定映射,也单独创建了一个类Binding
    3217000090abc9b5dde2

    • 对于构造函数,后面我们通过几个例子就可以知道每个参数表示的含义

    • 提供了一些函数用户获取绑定两端Exchange和Queue的基本信息

    Direct模式的绑定
    new Binding(someQueue, someDirectExchange, "foo.bar")
    Fanout模式的绑定
    new Binding(someQueue, someFanoutExchange)
    Topic模式的绑定
    new Binding(someQueue, someTopicExchange, "foo.*")

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

  • 相关阅读:
    转载--编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议31~35)
    转载---编写高质量代码:改善Java程序的151个建议(第2章:基本类型___建议26~30)
    转载---编写高质量代码:改善Java程序的151个建议(第2章:基本类型___建议21~25)
    月薪两万不是梦,麻辣隔壁的
    23种设计模式(转)
    因为最近项目用到了shiro,所以转了份笔记研讨
    单例模式(摘)
    aop日志管理(摘)
    理解线程副本类(摘)
    eclipse反编译插件安装
  • 原文地址:https://www.cnblogs.com/bigdataZJ/p/springandrabbitmq3.html
Copyright © 2011-2022 走看看