<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 28,  comments - 13,  trackbacks - 0

    用java.util.timer在web工程中實(shí)現(xiàn)類(lèi)似觸發(fā)器的機(jī)制

    ?

    現(xiàn)在正在做的項(xiàng)目要實(shí)現(xiàn)一個(gè)定時(shí)出帳的觸發(fā)器, 開(kāi)始打算用spring整合的quartz工具來(lái)實(shí)現(xiàn)(同時(shí)spring也提供了對(duì)java.util.timer的支持),
    spring對(duì)quartz整合的方式,是在配置文件中通過(guò)bean的property項(xiàng)設(shè)置一個(gè)crontrigger表達(dá)式來(lái)實(shí)現(xiàn)精確的時(shí)點(diǎn)觸發(fā),但是由于spring只有在啟動(dòng)的時(shí)候?qū)ψ⑷胫颠M(jìn)行讀取,這樣的話(huà)就很難實(shí)現(xiàn)通過(guò)運(yùn)行時(shí)讀取配置參數(shù),達(dá)到不用重啟服務(wù)即可改變出帳時(shí)間的目的,所以只好自己尋找好一點(diǎn)的解決方案.

    ?

    在網(wǎng)上找到了,看了很受啟發(fā),我略做了一些修改,實(shí)現(xiàn)了在每個(gè)月的某一天的某一個(gè)時(shí)間進(jìn)行任務(wù)操作的功能.

    ?

    代碼及注釋如下:

    ?

    先要實(shí)現(xiàn)一個(gè)系統(tǒng)的監(jiān)聽(tīng)器:



    /**
    *?

    title:?


    *?
    description:?


    *?
    copyright:?copyright?(c)chen?meng?2005


    *?
    company:?陳盟?


    *?
    *?
    @author ?陳盟
    *?
    @version ?1.0
    *?
    @since ?2005-1-13?/?17:26:41
    */

    package ?com.wellsoon.cttbj.vab.background;




    import ?java.util.date;



    import ?javax.servlet.servletcontextevent;
    import ?javax.servlet.servletcontextlistener;




    public ? class ?settleaccountlistener? implements ?servletcontextlistener?{

    private ?java.util.timer?timer? = ? null ;




    /* ?
    *?@see?javax.servlet.servletcontextlistener#contextinitialized(javax.servlet.servletcontextevent)
    */
    public ? void ?contextinitialized(servletcontextevent?event)?{
    date?taskrun?
    = ? null ;

    // ?todo?auto-generated?method?stub
    taskrun? = ? new ?date();
    timer?
    = ? new ?java.util.timer( true );
    event.getservletcontext().log(定時(shí)器已啟動(dòng));?
    / 在這里每隔一分鐘輪詢(xún)一次出帳任務(wù),如果任務(wù)間隔比較大的話(huà)建議把這個(gè)值設(shè)的大一點(diǎn),但此設(shè)置值將間接影響可設(shè)定的觸發(fā)精度.
    timer.schedule(
    new ?settleaccounttask(),? 0 ,? 60 * 1000 );? /
    event.getservletcontext().log(已經(jīng)添加任務(wù)調(diào)度表);



    }



    /* ?
    *?@see?javax.servlet.servletcontextlistener#contextdestroyed(javax.servlet.servletcontextevent)
    */
    public ? void ?contextdestroyed(servletcontextevent?event)?{
    // ?todo?auto-generated?method?stub
    timer.cancel();
    event.getservletcontext().log(定時(shí)器銷(xiāo)毀);



    }



    }



    接著來(lái)看settleaccounttask的實(shí)現(xiàn):



    /**
    *?

    title:?


    *?
    description:?


    *?
    copyright:?copyright?(c)chen?meng?2005


    *?
    company:?陳盟?


    *?
    *?
    @author ?陳盟
    *?
    @version ?1.0
    *?
    @since ?2005-1-13?/?17:35:55
    */



    package ?com.wellsoon.cttbj.vab.background;



    import ?java.util.calendar;
    import ?java.util.date;
    import ?java.util.timertask;




    public ? class ?settleaccounttask? extends ?timertask?{



    private ? static ? boolean ?isrunning? = ? false ;
    private ? static ? long ?dotaskmillis? = ? 0l ;



    public ? void ?run()?{
    system.out.println(dotaskmillis);?
    // 下面兩個(gè)值代表每月的哪一天幾點(diǎn)進(jìn)行實(shí)際任務(wù)操作.可以通過(guò)數(shù)據(jù)庫(kù)查詢(xún)獲得
    int ?c_schedule_date? = ? 10 ;
    int ?c_schedule_hour? = ? 4 ;
    calendar?cal?
    = ?calendar.getinstance();
    // 如果任務(wù)量很大,在下次輪詢(xún)時(shí)仍在執(zhí)行上次輪詢(xún)的任務(wù),則跳過(guò)本次執(zhí)行,直接錯(cuò)過(guò).
    if ?( ! isrunning)?{
    // 如果當(dāng)前系統(tǒng)時(shí)間的day_of_month和hour_of_day不滿(mǎn)足以下條件,則跳過(guò)實(shí)際操作.
    if ?(c_schedule_date? == ?cal.get(calendar.day_of_month)?&&?c_schedule_hour? == ?cal.get(calendar.hour_of_day))?{
    // 如果上次執(zhí)行任務(wù)的時(shí)間距此次輪詢(xún)時(shí)間間隔太短,則跳過(guò)實(shí)際操作.
    if ((dotaskmillis? 2 * 60 * 60 * 1000 )? < ?cal.gettimeinmillis())?{
    // ?詳細(xì)任務(wù)
    isrunning? = ? true ;
    system.out.println(執(zhí)行出帳操作);
    dotaskmillis?
    = ?cal.gettimeinmillis();
    system.out.println(dotaskmillis);
    isrunning?
    = ? false ;
    }
    }
    }?
    else ?{
    system.out.println(錯(cuò)過(guò));
    }
    }
    }



    最后,在web.xml中加上

    <listener>
    ? <listener-class>
    ??? com.xxx.background.settleaccountlistener
    ? </listener-class>
    </listener>

    ?


    就可以了.
    如果有更好的解決方式, 希望您回復(fù).

    posted on 2007-01-22 17:35 Lib 閱讀(2797) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567



    我的JavaEye博客
    http://lib.javaeye.com


    常用鏈接

    留言簿(2)

    隨筆分類(lèi)

    文章分類(lèi)

    FLASH

    Java

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲精品在线播放视频| 亚洲精品无码成人片久久不卡| 永久免费视频网站在线观看| 亚洲成a人片在线看| 亚洲AⅤ视频一区二区三区| 99麻豆久久久国产精品免费| 亚洲人成影院午夜网站| 免费乱码中文字幕网站| 久艹视频在线免费观看| 亚洲精品国产av成拍色拍| 中文亚洲成a人片在线观看| 99久久久国产精品免费无卡顿| 亚洲AV成人无码久久WWW| 亚洲人成77777在线播放网站| 国产精品成人观看视频免费 | 亚洲真人日本在线| 亚洲第一网站免费视频| 久久久久久亚洲精品无码 | 在线播放免费人成视频网站| 亚洲免费视频在线观看| 免费在线不卡视频| 免费观看黄色的网站| 一个人看的www免费高清| 亚洲成a人片在线观看精品| 亚洲精品成人无限看| 永久免费无码网站在线观看| 久久久久高潮毛片免费全部播放 | 国产男女性潮高清免费网站| 久久久久久AV无码免费网站下载| 免费人成动漫在线播放r18| 亚洲国产美女精品久久久久| 国产成人麻豆亚洲综合无码精品 | 免费夜色污私人影院在线观看| 永久免费在线观看视频| 久久九九免费高清视频| 亚洲av日韩综合一区久热| 亚洲精品影院久久久久久| 亚洲第一AAAAA片| 国产偷国产偷亚洲高清日韩| 国产精品免费看久久久久| 成人片黄网站A毛片免费|