DelayQueue延時(shí)隊(duì)列

需求場(chǎng)景

(Delay)代碼需要延時(shí)執(zhí)行,(Queue)需要不斷失敗重試

實(shí)例

當(dāng)前時(shí)間延時(shí)5s執(zhí)行Task,并在Task中添加一個(gè)指定時(shí)間執(zhí)行的延時(shí)隊(duì)列
try { 
     //第一個(gè)參數(shù): 延時(shí)任務(wù)中需要使用的參數(shù)對(duì)象,
     //第二個(gè)參數(shù): 傳入new Date()作為延時(shí)的基準(zhǔn)時(shí)間 
     DelayGetPrise delay = new DelayGetPrise(asset, new Date());
     GetOpenPriseTask.addtask(delay);
} catch (Exception e) {
     e.printStackTrace();
}
/**
 * @Auther: Young
 * @Date: 2019/4/13 10:28
 * @Description:
 */
@Data
public class DelayGetPrise  implements Delayed {

    public DelayGetPrise(Asset asset, Date endDate)
    {
        this.asset = asset;
        this.endDate = endDate.getTime();
    }

    private long endDate;

    private Asset asset;  //獲取的時(shí)間

    @Override
    //調(diào)用處傳入時(shí)間的基礎(chǔ)上延時(shí) 5s鐘后執(zhí)行task
    public long getDelay(TimeUnit unit) {
        return (endDate + 5000) - System.currentTimeMillis();
    }

    @Override
    public int compareTo(Delayed o) {
        DelayGetPrise jia = (DelayGetPrise) o;
        if (this.endDate - jia.getEndDate() > 0)
            //時(shí)間到達(dá)
            return 1;
        else
            return 0;
    }
}
/**
 * @Auther: Young
 * @Date: 2019/4/13 10:27
 * @Description:該方法繼承AfterSpringLoaded,項(xiàng)目啟動(dòng)后就加載Task,初始化隊(duì)列等
 */
@Component
public class GetOpenPriseTask implements AfterSpringLoaded {

    private static final Logger logger = LoggerFactory.getLogger(GetOpenPriseTask.class);

    @Autowired
    private AssetService assetService;

    @Autowired
    private MarketService marketService;

    private static final BlockingQueue<DelayGetPrise> getOpenPriseQueue = new DelayQueue<DelayGetPrise>();

    public static void addtask(DelayGetPrise dalay) {
        getOpenPriseQueue.add(dalay);
    }

    @Override
    public void load() {
        while (true) {
            try {
                logger.info("task任務(wù) 開(kāi)始");
                DelayGetPrise prise = getOpenPriseQueue.take();
                try {
                    Asset asset = prise.getAsset();
                    ...
                    //失敗重試
                    if (失敗) {
                        logger.error("Task任務(wù) 數(shù)據(jù)異常,重試");
                        //注意此處傳入的時(shí)間
                        DelayGetPrise newDelay = new DelayGetPrise(asset, new Date());
                        GetOpenPriseTask.addtask(newDelay);
                        //此處不能用break,否則會(huì)跳出while(true),關(guān)閉隊(duì)列
                        continue;
                    } else {
                        logger.info("Task任務(wù) 正常邏輯執(zhí)行");
                        ...
                        logger.info("Task任務(wù)完成");

                        LFExcuter.excute(() -> {
                             try {
                                  //指定時(shí)間延時(shí)Task
                                  int delay = asset.getPeriodValue().multiply(new BigDecimal(6)).intValue();
                                  Calendar calUp = Calendar.getInstance();
                                  int delaysecond = RandomUtil.randomInt(delay + 1);
                                  calUp.add(Calendar.SECOND, delaysecond);
                                  logger.info("指定時(shí)間:delay: " + delaysecond + "秒");
                                  //在計(jì)算好的時(shí)間基礎(chǔ)上延時(shí)
                                  DelayAutoBuy delayAutoUp = new DelayAutoBuy(asset, calUp.getTime(), ExchangeConstant.ORDER_TYPE.UP);
                                  AutoBuyTask.addtask(delayAutoUp);
                                } catch (Exception e) {
                                    logger.error("指定時(shí)間Task任務(wù)", e);
                                }
                            });
                        }
                } catch (Exception e) {
                    logger.error("獲取隊(duì)列錯(cuò)誤,重試Task任務(wù)", e);
                    GetOpenPriseTask.addtask(prise);
                }
            } catch (Exception e) {
                logger.error("指定時(shí)間Task任務(wù) 異常:", e);
            }
            logger.info("Task任務(wù) 結(jié)束");
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侍咱,一起剝皮案震驚了整個(gè)濱河市蛀序,隨后出現(xiàn)的幾起案子财破,更是在濱河造成了極大的恐慌,老刑警劉巖锐朴,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件救拉,死亡現(xiàn)場(chǎng)離奇詭異埃仪,居然都是意外死亡响谓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門毁嗦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亲茅,“玉大人,你說(shuō)我怎么就攤上這事狗准】寺啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵腔长,是天一觀的道長(zhǎng)袭祟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饼酿,這世上最難降的妖魔是什么榕酒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮故俐,結(jié)果婚禮上想鹰,老公的妹妹穿的比我還像新娘。我一直安慰自己药版,他們只是感情好辑舷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著槽片,像睡著了一般何缓。 火紅的嫁衣襯著肌膚如雪肢础。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天碌廓,我揣著相機(jī)與錄音传轰,去河邊找鬼。 笑死谷婆,一個(gè)胖子當(dāng)著我的面吹牛慨蛙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纪挎,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼期贫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了异袄?” 一聲冷哼從身側(cè)響起通砍,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烤蜕,沒(méi)想到半個(gè)月后封孙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玖绿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年敛瓷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斑匪。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锋勺,靈堂內(nèi)的尸體忽然破棺而出蚀瘸,到底是詐尸還是另有隱情,我是刑警寧澤庶橱,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布贮勃,位于F島的核電站,受9級(jí)特大地震影響苏章,放射性物質(zhì)發(fā)生泄漏寂嘉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一枫绅、第九天 我趴在偏房一處隱蔽的房頂上張望泉孩。 院中可真熱鬧,春花似錦并淋、人聲如沸寓搬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)句喷。三九已至镣典,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唾琼,已是汗流浹背兄春。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锡溯,地道東北人神郊。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趾唱,于是被迫代替她去往敵國(guó)和親涌乳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容