DelayQueue:,1)java自帶延時(shí)獲取元素礁哄,無(wú)界阻塞隊(duì)列长酗,2)隊(duì)列內(nèi)部用PriorityQueue實(shí)現(xiàn)。? ? ?創(chuàng)建元素時(shí)可指定多久才能從隊(duì)列中獲取當(dāng)前元素桐绒。期滿(mǎn)才從隊(duì)列中提取夺脾,沒(méi)到延時(shí)時(shí)間,阻塞當(dāng)前線(xiàn)程茉继。
泛型隊(duì)列咧叭,繼承Delayed,需重寫(xiě)getDelay和compareTo方法烁竭。
1.public class DelayQueue<E extends Delayed>extends AbstractQueue <E>
2.public int compareTo(T o); 往DelayQueue加入數(shù)據(jù)執(zhí)行佳簸,根據(jù)返回值判斷位置。排得越前颖变,越先被消費(fèi)
3. long getDelay(TimeUnit unit);判斷消息是否到期。負(fù)數(shù)听想,已到期腥刹,可讀。
優(yōu)點(diǎn):java自帶汉买,輕量級(jí)衔峰,使用簡(jiǎn)單
缺點(diǎn):存儲(chǔ)內(nèi)存中,服務(wù)器重啟會(huì)造成數(shù)據(jù)丟失,配合redis使用垫卤。數(shù)量大用mq
訂單類(lèi)威彰,實(shí)現(xiàn)Delayed接口
unit.convert(this.createdTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()+expireTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS);
數(shù)據(jù)量小推薦使用:DelayQueue+redis
DelayQueue分布式環(huán)境中就會(huì)重復(fù)執(zhí)行穴肘;所以加redis:
每次生成訂單時(shí)歇盼,同時(shí)向 redis setnx 設(shè)定該未支付訂單,
每次查詢(xún)待支付訂單時(shí)須從 redis 中也查一遍评抚,
redis 不存在該訂單豹缀,改為已取消。
數(shù)據(jù)量大推薦使用:RabbitMQ
AB 兩個(gè)隊(duì)列慨代,A 隊(duì)列設(shè)置消息過(guò)期時(shí)間邢笙,沒(méi)有消費(fèi)者,A 過(guò)期自動(dòng)轉(zhuǎn)發(fā)到 B 侍匙,B 隊(duì)列消費(fèi)者取消氮惯。
http://www.reibang.com/p/2ef8646fe8f7