先來說一下什麼是延遲佇列,延遲佇列就是訊息進入佇列之後不會立即被訊息,只有達到指定時間後,才會被消費.
常見需求: 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 ...