" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java處理延時任務(wù)的常用幾種解決方案

 更新時間:2022年05月31日 16:04:12   作者:Monster_起飛  
本文主要介紹了Java處理延時任務(wù)的常用幾種解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

項(xiàng)目中經(jīng)常會遇到如下的需求:

  • 創(chuàng)建訂單30分鐘未支付,訂單自動取消。
  • 訂單支付成功后,1分鐘后給用戶發(fā)送短信,提醒用戶評價。

針對延時任務(wù)需求,我們可以采用如下的解決方案:

數(shù)據(jù)庫輪詢

原理

通過一個線程定時的掃描數(shù)據(jù)庫當(dāng)天創(chuàng)建的訂單,根據(jù)訂單的創(chuàng)建時間來判斷訂單是否超時,針對超時訂單進(jìn)行相關(guān)的更新操作。
實(shí)現(xiàn)技術(shù)
采用Spring Boot結(jié)合quartz來實(shí)現(xiàn),具體的實(shí)現(xiàn)可以參考之前的文章。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

此方案比較簡單,且quartz也支持集群操作。

缺點(diǎn):

  • 系統(tǒng)訂單數(shù)據(jù)量比較大,每個幾分鐘輪詢數(shù)據(jù)庫,對服務(wù)器和數(shù)據(jù)庫的內(nèi)存消耗比較大。
  • 存在延遲,即使1分鐘掃描一次數(shù)據(jù)庫,也會存在1分鐘的延遲。

Java延遲隊(duì)列

原理

采用JDK自帶的DelayQueue來實(shí)現(xiàn),這是一個無界阻塞隊(duì)列,該隊(duì)列只有在延遲期滿的時候才能從中獲取元素,放入DelayQueue中的對象。
實(shí)現(xiàn)技術(shù)
使用JDK的DelayQueue隊(duì)列進(jìn)行相關(guān)操作即可。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

此方案是基于內(nèi)存操作所以效率高,任務(wù)觸發(fā)時間延遲低.

缺點(diǎn):

  • 消息隊(duì)列的信息都存放在內(nèi)存中,一旦服務(wù)器重啟,則數(shù)據(jù)全部消失
  • 無法進(jìn)行集群用擴(kuò)展
  • 由于本機(jī)內(nèi)存有限,一旦訂單數(shù)據(jù)量過大,很容易出現(xiàn)OOM異常。

Reids監(jiān)聽失效key

原理

該方案使用Redis的Keyspace Notifications,利用key失效的提供的回調(diào)機(jī)制,處理相關(guān)的業(yè)務(wù)實(shí)現(xiàn)

實(shí)現(xiàn)技術(shù)

基于reids的方案,實(shí)現(xiàn)MessageListener接口。

實(shí)現(xiàn)步驟

修改Redis配置文件
打開redis.conf 文件,搜索 “notify-keyspace-events”找到原本的notify-keyspace-events " ",修改為 “notify-keyspace-events Ex”,至此Redis 就支持Key過期事件的監(jiān)聽。

創(chuàng)建監(jiān)聽類,實(shí)現(xiàn)MessageListener接口

@Component
public class RedisKeyExpirationListener implements MessageListener
{
    private static final Logger logger = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
    
    public static final String KEY_PREX = "test::order:queue";
    
    @Override
    public void onMessage(Message message, byte[] pattern)
    {
        try
        {
            String expiredKey = message.toString();

            // 通過key來判斷
            if(!expiredKey.contains(KEY_PREX))
            {
                return;
            }
            
            //滿足條件處理具體的業(yè)務(wù)邏輯
        }
        catch (Exception e)
        {
            logger.error("失效事件失敗",e);
        }
    }
}

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

基于Redis實(shí)現(xiàn)簡單

缺點(diǎn):

  • 客戶端斷開后重連會導(dǎo)致所有事件丟失。
  • 高并發(fā)場景下,存在大量的失效key場景會導(dǎo)出失效時間存在延遲。
  • 此方案針對業(yè)務(wù)量較少且可靠性要求不高的場景使用。

RocketMq延遲消息

實(shí)現(xiàn)原理

基于RocketMQ設(shè)置消息的等級,發(fā)送延遲消息,RocketMQ延時消息會暫存在名為SCHEDULE_TOPIC_XXXX的Topic中,并根據(jù)delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一個queue只存相同延遲的消息,保證具有相同發(fā)送延遲的消息能夠順序消費(fèi)。broker會調(diào)度地消費(fèi)SCHEDULE_TOPIC_XXXX,將消息寫入真實(shí)的topic。
其具體步驟如下:

  • 修改消息Topic名稱和隊(duì)列信息
  • 轉(zhuǎn)發(fā)消息到延遲主題SCHEDULE_TOPIC_XXXX的CosumeQueue中
  • 延遲服務(wù)消費(fèi)SCHEDULE_TOPIC_XXXX消息
  • 將信息重新存儲到CommitLog中
  • 將消息投遞到目標(biāo)Topic中
  • 消費(fèi)者消費(fèi)目標(biāo)topic中的數(shù)據(jù)。
/**
    * 發(fā)送延遲消息
    * @param topic
    * @param msg
    */
   public void sendDelayMessage(String topic,Object msg)
   {
      Message msgMessage =new Message();
      //設(shè)置消息等級
      msgMessage.setDelayTimeLevel(2);
     rocketMQTemplate.convertAndSend(topic, msg);
   }

注意:RocketMQ延時消息的延遲時長不支持隨意時長的延遲,是通過特定的延遲等級來指定的。默認(rèn)支持18個等級的延遲消息,延時等級定義在RocketMQ服務(wù)端的MessageStoreConfig類中的如下變量中:

例如指定的延時等級為2,則表示延遲時長為5s,即延遲等級是從1開始計(jì)數(shù)的。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

支持高并發(fā)場景消息處理.

缺點(diǎn):

  • 引入額外的消息隊(duì)列,增加項(xiàng)目的維護(hù)和復(fù)雜度。
  • 支持固定時長的消息延遲,針對任意時長的消息延遲需要進(jìn)行擴(kuò)展。

總結(jié)

本文講解了針對延時任務(wù)的處理的幾種方案和相關(guān)的優(yōu)缺點(diǎn),針對不同的業(yè)務(wù)場景,選擇合適的解決方案。更多相關(guān)Java 延時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程變量ThreadLocal詳細(xì)解讀

    Java線程變量ThreadLocal詳細(xì)解讀

    這篇文章主要介紹了Java線程變量ThreadLocal詳細(xì)解讀,多線程訪問同一個變量的時候,很容易出現(xiàn)問題,特別是多線程對一個共享變量進(jìn)行寫入的時候,為了線程的安全在進(jìn)行數(shù)據(jù)寫入時候會進(jìn)行數(shù)據(jù)的同步,需要的朋友可以參考下
    2024-01-01
  • SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼

    SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼

    本篇文章主要介紹了SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • JAVA幫助文檔全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理

    JAVA幫助文檔全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理

    JDK(Java Development Kit,Java開發(fā)包,Java開發(fā)工具)是一個寫Java的applet和應(yīng)用程序的程序開發(fā)環(huán)境。它由一個處于操作系統(tǒng)層之上的運(yùn)行環(huán)境還有開發(fā)者編譯,調(diào)試和運(yùn)行用Java語言寫的applet和應(yīng)用程序所需的工具組成
    2014-01-01
  • Java基礎(chǔ)學(xué)習(xí)之字符緩沖流的應(yīng)用

    Java基礎(chǔ)學(xué)習(xí)之字符緩沖流的應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Java基礎(chǔ)中的字符緩沖流的相關(guān)應(yīng)用,例如復(fù)制Java文件等,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一
    2022-09-09
  • 使用Java實(shí)現(xiàn)生命游戲串行代碼示例

    使用Java實(shí)現(xiàn)生命游戲串行代碼示例

    生命游戲是一種二維細(xì)胞自動機(jī),由英國數(shù)學(xué)家在1970年發(fā)明,在游戲的過程中,細(xì)胞會形成各種有規(guī)律的結(jié)構(gòu),展現(xiàn)出生命的復(fù)雜性和多樣性,本文通過java和JavaFX實(shí)現(xiàn)了一個簡單的生命游戲,可以直觀的觀察到細(xì)胞的迭代過程,需要的朋友可以參考下
    2024-10-10
  • SpringBoot利用攔截器實(shí)現(xiàn)避免重復(fù)請求

    SpringBoot利用攔截器實(shí)現(xiàn)避免重復(fù)請求

    Spring MVC中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter),它主要用于攔截用戶請求并作相應(yīng)的處理。本文就將利用攔截器實(shí)現(xiàn)避免重復(fù)請求,感興趣的小伙伴可以了解一下
    2022-11-11
  • Spring-Boot中如何使用多線程處理任務(wù)方法

    Spring-Boot中如何使用多線程處理任務(wù)方法

    這篇文章主要介紹了Spring-Boot中如何使用多線程處理任務(wù)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java算法之時間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算

    Java算法之時間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算

    這篇文章主要介紹了Java算法之時間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java編程中10個最佳的異常處理技巧

    Java編程中10個最佳的異常處理技巧

    這篇文章主要介紹了Java編程中10個最佳的異常處理技巧,在本文中,將討論Java異常處理最佳實(shí)踐,這些Java最佳實(shí)踐遵循標(biāo)準(zhǔn)的JDK庫,和幾個處理錯誤和異常的開源代碼,這還是一個提供給java程序員編寫健壯代碼的便利手冊,需要的朋友可以參考下
    2015-01-01
  • Jenkins初級應(yīng)用之Invoke?Phing?targets插件配置

    Jenkins初級應(yīng)用之Invoke?Phing?targets插件配置

    這篇文章主要為大家介紹了Jenkins初級應(yīng)用之Invoke?Phing?targets的插件配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪<BR>
    2022-04-04

最新評論

贵溪市| 华安县| 宜兰县| 江都市| 崇义县| 根河市| 台北县| 云南省| 丹江口市| 吉隆县| 杂多县| 东海县| 渝北区| 吕梁市| 旺苍县| 滁州市| 曲水县| 城口县| 南皮县| 加查县| 汶上县| 互助| 江川县| 通渭县| 涿州市| 丰县| 从江县| 潢川县| 晴隆县| 宜丰县| 沁水县| 阿合奇县| 平度市| 鲁山县| 安泽县| 丹寨县| 舒兰市| 茌平县| 滨州市| 涞源县| 信宜市|