【Vesta發(fā)號器源碼】SimpleTimer

Vesta發(fā)號器源碼解析——SimpleTimer

這個類是Timer的一個簡單的實現(xiàn),主要負責對時間控制

字段及屬性

    //日志
    protected static final Logger log = LoggerFactory.getLogger(SimpleTimer.class);
    //Id元數(shù)據(jù)
    protected IdMeta idMeta;
    //Id的類型
    protected IdType idType;
    //最大時間
    protected long maxTime;
    //時間壓縮的基礎(chǔ),相當于新的時間起點
    protected long epoch = EPOCH

初始化方法

初始化方法

    public void init(IdMeta idMeta, IdType idType) {
        this.idMeta = idMeta;
        //利用移位操作計算出時間的長度能夠標示的最大時間
        this.maxTime = (1L << idMeta.getTimeBits()) - 1;
        this.idType = idType;
        this.genTime();
        this.timerUsedLog();
    }

timer的使用日志

記錄出能夠使用的天數(shù)

    public void timerUsedLog(){
        //最大的時間計算
        Date expirationDate = transTime(maxTime);
        //計算出最大的值所能標示的具體時間
        long days = ((expirationDate.getTime() - System.currentTimeMillis())/(1000 * 60 * 60 * 24));
        //記錄日志
        log.info("The current time bit length is {}, the expiration date is {}, this can be used for {} days.",
                idMeta.getTimeBits(), expirationDate, days);
    }

設(shè)置時間壓縮基礎(chǔ)

    //設(shè)置epoch
    public void setEpoch(long epoch) {
        this.epoch = epoch;
    }

時間轉(zhuǎn)換函數(shù)

時間轉(zhuǎn)換函數(shù),將壓縮后的時間戳轉(zhuǎn)換為date對象

    public Date transTime(long time) {
        //做好類型區(qū)分鸯屿,區(qū)別到底按照毫秒級計算還是秒級
        if (idType == IdType.MILLISECONDS) {
            return new Date(time + epoch);
        } else {
            return new Date(time * 1000 + epoch);
        }
    }

驗證時間戳

校驗時間的先后順序

    public void validateTimestamp(long lastTimestamp, long timestamp) {
        //發(fā)生了時鐘回撥
        if (timestamp < lastTimestamp) {
            if (log.isErrorEnabled())
                //記錄日志,時鐘回撥了把敢,拒絕生成id寄摆,拋出異常
                log.error(String
                        .format("Clock moved backwards.  Refusing to generate id for %d second/milisecond.",
                                lastTimestamp - timestamp));

            throw new IllegalStateException(
                    String.format(
                            "Clock moved backwards.  Refusing to generate id for %d second/milisecond.",
                            lastTimestamp - timestamp));
        }
    }

時間等待

用于在發(fā)生次數(shù)滿了的時候進行時間的等待,等待到了下一個時間周期來的時候返回新的時間戳

    public long tillNextTimeUnit(final long lastTimestamp) {
        //記錄日志
        if (log.isInfoEnabled())
            log.info(String
                    .format("Ids are used out during %d. Waiting till next second/milisencond.",
                            lastTimestamp));
        //生成新的時間戳
        long timestamp = genTime();
        //新的時間戳如果沒有比之前的大修赞,說明仍然處于老時間
        //自旋鎖等待
        while (timestamp <= lastTimestamp) {
            timestamp = genTime();
        }
        
        //時間更新婶恼,記錄日志
        if (log.isInfoEnabled())
            log.info(String.format("Next second/milisencond %d is up.",
                    timestamp));
        //返回新的時間戳
        return timestamp;
    }

生成時間

生成壓縮后的時間戳桑阶,也就是利用最新的時間減去壓縮基礎(chǔ)

    public long genTime() {
        long time;
        //按類型做好區(qū)分
        if (idType == IdType.MILLISECONDS) {
            time = (System.currentTimeMillis() - epoch);
        } else {
            time = (System.currentTimeMillis() - epoch) / 1000;
        }
        //校驗生成的時間戳是否有效,主要是看是夠超超時
        validateTimestamp(time);
        return time;
    }

時間戳校驗

校驗時間戳是否已經(jīng)超過了最大的生成時間


    protected void validateTimestamp(long timestamp){
        if (timestamp > maxTime) {
            String error = String.format(
                    "The current timestamp (%s >= %s) has overflowed, Vesta Service will be terminate.", timestamp, maxTime);
            log.error(error);
            throw new RuntimeException(error);
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勾邦,一起剝皮案震驚了整個濱河市蚣录,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眷篇,老刑警劉巖萎河,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕉饼,居然都是意外死亡虐杯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門昧港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擎椰,“玉大人,你說我怎么就攤上這事慨飘∪泛” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵瓤的,是天一觀的道長休弃。 經(jīng)常有香客問我,道長圈膏,這世上最難降的妖魔是什么塔猾? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮稽坤,結(jié)果婚禮上丈甸,老公的妹妹穿的比我還像新娘。我一直安慰自己尿褪,他們只是感情好睦擂,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杖玲,像睡著了一般顿仇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摆马,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天臼闻,我揣著相機與錄音,去河邊找鬼囤采。 笑死述呐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蕉毯。 我是一名探鬼主播乓搬,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼思犁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缤谎?” 一聲冷哼從身側(cè)響起抒倚,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤褐着,失蹤者是張志新(化名)和其女友劉穎坷澡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含蓉,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡频敛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了馅扣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟赚。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖差油,靈堂內(nèi)的尸體忽然破棺而出拗军,到底是詐尸還是另有隱情,我是刑警寧澤蓄喇,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布发侵,位于F島的核電站,受9級特大地震影響妆偏,放射性物質(zhì)發(fā)生泄漏刃鳄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一钱骂、第九天 我趴在偏房一處隱蔽的房頂上張望叔锐。 院中可真熱鬧,春花似錦见秽、人聲如沸愉烙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽步责。三九已至,卻和暖如春肮蛹,著一層夾襖步出監(jiān)牢的瞬間勺择,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工伦忠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留省核,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓昆码,卻偏偏與公主長得像气忠,于是被迫代替她去往敵國和親邻储。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • 江南終于見到陽光了旧噪,淅淅瀝瀝的雨趕緊走吧吨娜!梅花很快就開的熱烈,掃碼加入支點交易所淘钟,布局未來
    明朝_89bc閱讀 176評論 0 1
  • 春天宦赠,是個動詞。春來了…… 款款而來米母,緩緩而來勾扭,翩翩而來……紅了碧桃,黃了連翹铁瞒,艷了海棠妙色,妝了整個春天。 擠擠挨挨...
    涼月西風閱讀 352評論 0 3
  • 文|蘇坡六 數(shù)據(jù)統(tǒng)計师枣,有一億人的微信朋友圈設(shè)置的是僅三天可見怪瓶。 其中也有我,后來我直接設(shè)置為僅半年可見践美。因為半年自...
    蘇坡六閱讀 354評論 1 1
  • 高峰期的公交車站
    醉吾春秋簡閱讀 136評論 1 0
  • 昨日于河邊走過洗贰,見桃花開得極盛,河中有舊舸陨倡,蘭槳已折敛滋,被柳枝系于根底,空接落英兴革。我實在是個俗女子绎晃,比不得寶釵只挹翠...
    蘇長亭閱讀 636評論 29 22