Spring集成RabbitMQ-如何构建队列和转换器

上篇《Spring集成RabbitMQ-配置消息服务》我们介绍了Spring AMQP中是如何声明AmqpAdmin以及利用AmqpAdmin实现类RabbitAdmin来创建queue和exchange的。这篇将接着上篇继续,说说有关队列Queue和转换器Exchange创建的那些事儿。

创建单个Queue和Exchange的API

从版本1.6开始,Spring AMQP就引入了及其方便易用的API用于创建并配置Queue和Exchange。下面就是通过Java配置类的方式创建的实例代码


37cb00001f02c930c995
  • 通过QueueBuilder创建了一个名为“foo”的Queue

  • 该队列是nonDurable即不是持久化的,一个临时的队列

  • 该队列是一个排他的队列即exclusive

  • 该队列通过withArgument设置了队列参数放入一个map集合中

  • 同理,通过ExchangeBuilder创建了一个名为“foo”的direct类型的exchange

  • 该exchange是自动删除的即autoDelete

  • 该exchange也通过withArgument设置交换器的参数

  • 两个Builder最终都通过build方法完成Queue和Exchange的创建

通过看源码,我们发现,这两个build方式内部调用的是对应的构造函数


37c900002d4facce95d4
3222000327847cc90d1f
  • 从版本2.0之后,通过ExchangeBuilder创建的exchange都是durable的,即持久化的

  • 如果想配置为非持久化的,可以通过调用方法.durable(false)进行设置

  • 同时,无参的函数durable()也将不再对外提供使用

创建多个Queue和Exchange的API

从版本1.5之后,就能够方便的创建多个Queue或者Exchange了,下面同样是基于Java配置类方式的代码


37c8000356713c242bc8
37c90000372d0013139a

通过代码可以发现,不仅可以批量的创建Queue和Exchange,而且还可以批量创建绑定关系并将其放进List集合中返回使用。

有关属性name和id的一个注意事项

在标签定义<rabbit:queue/>和<rabbit:exchange/>中的name标识了queue和exchange的名称,对于队列queue而言,如果在定义是没有填写name属性,则会默认创建一个上篇提到的AnonymousQueue。

在2.0版本之前,name同时具有声明为一个bean的名称的效果,等同于<bean>中的name一样,这会存在一些问题

  • 它不允许queue和exchange使用相同的name

  • name也不支持SpEL表达式

从2.0版本之后,在你为这些标签声明name和id属性的时候,将不会将其视为bean的别名了。如果你想实现queue和exchange使用同样的name,那么需要加上id属性。

匿名队列AnonymousQueue

当你需要用到一个名称唯一的,自动删除的,排他性的队列,这时候AnonymousQueue就排上用场了,想比上篇提到的自动声明一个空字符串的队列,其有以下优势

  • 当connection连接建立的时候,队列才被创建,但是也要等相对比较久的时间,需要等到所有的beans都就位,而且这些bean在使用的时候还需要知道队列的名称,这一套显然比较复杂繁琐

  • 如果由于某种原因,服务挂了,这时候如果使用声明的queue,在服务重新启动后,队列的名称就会改变,但是对于AnonymousQueue有一点比较好的就是,服务会启动一个与之前一样名称的queue

那么AnonymousQueue是如何命名的呢,这就要说到匿名队列的命名策略了


37c700003c7fb9b896d6
  • anon1方法生成就是以“spring.gen-”开头的队列名,后面是通过UUID规则生成的,比如最终的队列名是这样的spring.gen-MRBv9sqISkuCiPfOYfpo4g

  • anon2方法生成就是以“foo”开头,并对UUID规则生成的序列进行了Base64编码得到的对列明

  • anon3方法生成就是纯UUID规则得到的名称,比如f20c818a-006b-4416-bf91-643590fedb0e

延迟消息交换机

从版本1.6之后就支持了Delayed Messge Exchange。可以通过下面的方式进行XML的配置
<rabbit:topic-exchange name="topic" delayed="true" />
如果要发送延时的消息,我们可以在MessageProperties中像这样声明

37ca0000444b3f88a785

或者这样


37c8000363aab4c5ff7f

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容