日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

先熟悉下面會(huì)用到的一些名詞~

  • exchange: 交換機(jī)
  • routingkey: 路由key
  • queue: 隊(duì)列

exchange和queue是需要綁定在一起的,然后消息發(fā)送到exchange再由exchange通過(guò)routingkey發(fā)送到對(duì)應(yīng)的隊(duì)列中。

一張圖帶你理解和實(shí)現(xiàn)RabbitMQ的延遲隊(duì)列功能

exchange分四種

Default Exchange

這種是特殊的Direct Exchange,是rabbitmq內(nèi)部默認(rèn)的一個(gè)交換機(jī)。該交換機(jī)的name是空字符串,所有queue都默認(rèn)binding 到該交換機(jī)上。所有binding到該交換機(jī)上的queue,routing-key都和queue的name一樣。

注意: 這就是為什么你直接創(chuàng)建一個(gè)queue也能正常的生產(chǎn)與消費(fèi),因?yàn)閷?duì)應(yīng)的exchange是RabbitMQ默認(rèn)的,routingkey就是該隊(duì)列的名字

Topic Exchange

通配符交換機(jī),exchange會(huì)把消息發(fā)送到一個(gè)或者多個(gè)滿(mǎn)足通配符規(guī)則的routing-key的queue。其中表號(hào)匹配一個(gè)word,#匹配多個(gè)word和路徑,路徑之間通過(guò).隔開(kāi)。如滿(mǎn)足a..c的routing-key有a.hello.c;滿(mǎn)足#.hello的routing-key有a.b.c.helo。

Fanout Exchange

扇形交換機(jī),該交換機(jī)會(huì)把消息發(fā)送到所有binding到該交換機(jī)上的queue。這種是publisher/subcribe模式。用來(lái)做廣播最好。

所有該exchagne上指定的routing-key都會(huì)被ignore掉。

Header Exchange

設(shè)置header attribute參數(shù)類(lèi)型的交換機(jī)。

簡(jiǎn)單的了解之后,下面就是延遲隊(duì)列的實(shí)現(xiàn)方式

延遲隊(duì)列的實(shí)現(xiàn)

延遲分兩種

  • 在msg上設(shè)置過(guò)期時(shí)間
  • 在隊(duì)列上設(shè)置過(guò)期時(shí)間
一張圖帶你理解和實(shí)現(xiàn)RabbitMQ的延遲隊(duì)列功能

一定要看懂這張圖!!!

如上圖創(chuàng)建三個(gè)exchange和三個(gè)隊(duì)列

@Bean

public DirectExchange delayExchange() {

return new DirectExchange(DELAY_EXCHANGE_NAME);

}

@Bean

public DirectExchange processExchange() {

return new DirectExchange(PROCESS_EXCHANGE_NAME);

}

@Bean

public DirectExchange delayQueueExchange() {

return new DirectExchange(DELAY_QUEUE_EXCHANGE_NAME);

}

/**

* 存放延遲消息的隊(duì)列 最后將會(huì)轉(zhuǎn)發(fā)給exchange(實(shí)際消費(fèi)隊(duì)列對(duì)應(yīng)的)

* @return

*/

@Bean

Queue delayQueue4Msg(){

return QueueBuilder.durable(DELAY_QUEUE_MSG)

.withArgument("x-dead-letter-exchange", PROCESS_EXCHANGE_NAME)

.withArgument("x-dead-letter-routing-key", ROUTING_KEY)

.build();

}

@Bean

public Queue processQueue() {

return QueueBuilder.durable(PROCESS_QUEUE)

.build();

}

/**

* 存放消息的延遲隊(duì)列 最后將會(huì)轉(zhuǎn)發(fā)給exchange(實(shí)際消費(fèi)隊(duì)列對(duì)應(yīng)的)

* @return

*/

@Bean

public Queue delayQueue4Queue() {

return QueueBuilder.durable(DELAY_QUEUE_NAME)

.withArgument("x-dead-letter-exchange", PROCESS_EXCHANGE_NAME) // DLX

.withArgument("x-dead-letter-routing-key", ROUTING_KEY)

.withArgument("x-message-ttl", 3000) // 設(shè)置隊(duì)列的過(guò)期時(shí)間 單位毫秒

.build();

}

接下來(lái)將每個(gè)exchange和對(duì)應(yīng)的mq綁定

@Bean

Binding delayBinding() {

return BindingBuilder.bind(delayQueue4Msg())

.to(delayExchange())

.with(ROUTING_KEY);

}

@Bean

Binding queueBinding() {

return BindingBuilder.bind(processQueue())

.to(processExchange())

.with(ROUTING_KEY);

}

@Bean

Binding delayQueueBind() {

return BindingBuilder.bind(delayQueue4Queue())

.to(delayQueueExchange())

.with(ROUTING_KEY);

}

發(fā)送消息的方式

public void sendDelayMsg(Msg msg) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(msg.getId() + " 延遲消息發(fā)送時(shí)間:" + sdf.format(new Date()));

rabbitTemplate.convertAndSend(RabbitConfig.DELAY_EXCHANGE_NAME, "delay", msg, new MessagePostProcessor() {

@Override

public Message postProcessMessage(Message message) throws AmqpException {

message.getMessageProperties().setExpiration(msg.getTtl() + "");

return message;

}

});

}

public void sendDelayQueue(Msg msg) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(msg.getId() + " 延遲隊(duì)列消息發(fā)送時(shí)間:" + sdf.format(new Date()));

rabbitTemplate.convertAndSend(RabbitConfig.DELAY_QUEUE_EXCHANGE_NAME,"delay", msg);

}

驗(yàn)證結(jié)果

為每個(gè)消息設(shè)置過(guò)期時(shí)間

一張圖帶你理解和實(shí)現(xiàn)RabbitMQ的延遲隊(duì)列功能

為隊(duì)列設(shè)置過(guò)期時(shí)間

一張圖帶你理解和實(shí)現(xiàn)RabbitMQ的延遲隊(duì)列功能

如果你把設(shè)置了過(guò)期時(shí)間的消息發(fā)送到設(shè)置了過(guò)期時(shí)間的隊(duì)里中的時(shí)候,以最短的時(shí)間為準(zhǔn)。

最后

其實(shí)我在實(shí)現(xiàn)的過(guò)程中也花了很長(zhǎng)的時(shí)間,主要就是被exchange和queue搞亂掉了,最后索性自己畫(huà)了個(gè)圖,按照?qǐng)D來(lái)一個(gè)一個(gè)創(chuàng)建與綁定。之后就很清晰很容易的實(shí)現(xiàn)了。

強(qiáng)調(diào)!!! 如果在開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn)exchange和queue綁定錯(cuò)誤了,建議從管理界面將queue和exchange unbind或者刪除重新創(chuàng)建!

分享到:
標(biāo)簽:RabbitMQ
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定