SpringBoot RabbitMQ實現延遲佇列

2021-10-04 20:23:23 字數 3260 閱讀 7616

先來說一下什麼是延遲佇列,延遲佇列就是訊息進入佇列之後不會立即被訊息,只有達到指定時間後,才會被消費.

常見需求: 1、在網上**下單後,30分鐘未支付,取消訂單,回滾庫存;

​ 2、新使用者註冊成功7天後,傳送簡訊.

實現方法: 1、定時器 2、延遲佇列

但rabbitmq未提供延遲佇列功能,但是可以使用**ttl+死信佇列(dlx)**組合(利用他們的特性)實現延遲佇列的效果.

在pom中匯入以下依賴

org.springframework.boot<

/groupid>

spring-boot-starter-amqp<

/artifactid>

<

/dependency>

在生產者工程中,建立乙個配置類,宣告交換機與佇列的繫結關係
import org.springframework.amqp.core.*;

import org.springframework.beans.factory.annotation.qualifier;

import org.springframework.context.annotation.bean;

import org.springframework.context.annotation.configuration;

@configuration

public

class

ttldlxconfig

//宣告死信佇列;

@bean

("dlxqueue"

)public queue dlxqueue()

//繫結死信交換機和死信佇列;

@bean

public binding binddlxexchangequeue

(@qualifier

("dlxqueue"

) queue queue,

@qualifier

("dlxexchange"

) exchange exchange)

//宣告普通交換機

@bean

("testexchange"

)public exchange testexchange()

/** * 宣告延遲佇列;

* ttl:設定訊息過期的時間,單位為毫秒,方便測試效果,這裡設定10秒過期,

* 也就是10秒後會傳送到死信交換機再到死信佇列;

* deadletterexchange:指定死信交換機的名稱;

* deadletterroutingkey:傳送死信訊息時指定的routingkey

* 上面我們死信佇列和死信交換機繫結時已經指定了"text.#"為其繫結routingkey;

* */

@bean

("testqueue"

)public queue testqueue()

//繫結普通交換機與延遲佇列;

//這裡的routingkey只是我們普通交換機與延遲佇列繫結,並不會影響死信訊息傳送到死信交換機;

@bean

public binding bindtestexchangequeue

(@qualifier

("testqueue"

) queue queue,

@qualifier

("testexchange"

) exchange exchange)

}

建立乙個測試類,傳送訊息到延遲佇列(注意routingkey一定要對應)
import com.itlw.config.ttldlxconfig;

import org.junit.test;

import org.junit.runner.runwith;

import org.springframework.amqp.rabbit.core.rabbittemplate;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.boot.test.context.springboottest;

import org.springframework.test.context.junit4.springrunner;

@runwith

(springrunner.

class

)@springboottest

public

class

producedtest

}

開啟rabbitmq後端頁面進行檢視

普通交換機和死信交換機已經建立,並且現在訊息還在延遲佇列中,等過10秒我們再看結果.

可以看到訊息已經到了死信佇列當中,並且訊息也是我們傳送的訊息.

建立乙個消費者從死信佇列中拿出訊息進行消費

import org.springframework.amqp.rabbit.annotation.rabbitlistener;

import org.springframework.stereotype.component;

@component

public

class

mylistener

}

啟動消費者工程,可以看到控制台的輸出:

在實際生成環境中,拿到這條死信訊息後,就可以進行其他的操作了,如未支付訂單,庫存進行回滾…

DelayQueue實現延遲訊息

最近想做乙個定時推送訊息的功能,經過調研了解到delayqueue,訊息物件需實現delayed介面裡的getdelay timeunit unit 方法,由於delayed繼承了comparable故需要實現compareto方法,可用於決定訊息的推送次序。以考試為例,設定每個考生的交卷時間點。學...

php redis實現延遲佇列

基於redis有序集實現延遲任務執行,比如某個時間給某個使用者發簡訊,訂單過期處理,等等 我是在tp5框架上寫的,實現起來很簡單,對於一些不是很複雜的應用足夠了,目前在公司專案中使用,後台程序並沒有實現多程序,不多說,貼 不回排版,見諒 1 命令列指令碼 執行方法 php think delay q...

實現延遲搜尋功能

搜尋延遲 平常在專案中,經常會遇到搜尋請求後台的情況,此時搜尋延遲就顯得尤為重要,如果沒有搜尋延遲功能,那麼使用者頁面將會顯得特別卡頓 import from react class search extends component this.onsearch this.onsearch.bind ...