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

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

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

    菜園子

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      7 Posts :: 1 Stories :: 31 Comments :: 0 Trackbacks

    在我們開(kāi)發(fā)的一個(gè)系統(tǒng)中,有定時(shí)任務(wù),自然就想到了Quartz,由于框架采用的Spring,Quartz跟Spring的集成也非常簡(jiǎn)單,所以就把Quartz配置到框架中,當(dāng)系統(tǒng)啟動(dòng)后,定時(shí)任務(wù)也就自動(dòng)啟動(dòng)。在開(kāi)發(fā)的過(guò)程中一直沒(méi)有發(fā)現(xiàn)問(wèn)題,但是最后上線的時(shí)候,采用的是weblogic cluster,啟動(dòng)了4個(gè)節(jié)點(diǎn),發(fā)現(xiàn)有的定時(shí)任務(wù)執(zhí)行了不止一次,才恍然大悟,4個(gè)節(jié)點(diǎn)啟動(dòng)了4個(gè)應(yīng)用,也就啟動(dòng)了4個(gè)定時(shí)任務(wù),所以在同一個(gè)時(shí)間定時(shí)任務(wù)執(zhí)行了不止一次。去網(wǎng)上搜索,發(fā)現(xiàn)Quartz也支持cluster,但是我覺(jué)得就我們的系統(tǒng)而言,沒(méi)有必要采用cluster的定時(shí)任務(wù),也許是比較懶吧,就想讓定時(shí)任務(wù)只執(zhí)行一次。在網(wǎng)上搜到了robbin的一篇文章(http://robbin.iteye.com/blog/40989 ),發(fā)現(xiàn)把quartz集中到webapp當(dāng)中還是有一定的風(fēng)險(xiǎn),同時(shí)同一個(gè)時(shí)間點(diǎn)執(zhí)行也不止一次。Robbin的解決辦法就是自己?jiǎn)为?dú)啟動(dòng)一個(gè)Job Server,來(lái)quartz跑job,不要部署在web容器中。 

    我也比較同意這個(gè)辦法。鑒于時(shí)間比較緊,就想有沒(méi)有比較方便的方法。其實(shí)把原來(lái)的webapp當(dāng)做一個(gè)quartz的容器就可以了。可以自己寫(xiě)一個(gè)線程來(lái)跑應(yīng)用,再寫(xiě)一個(gè)command啟動(dòng)這個(gè)線程就可以了。線程類(lèi)很簡(jiǎn)單,如下:

    public class StartServer {

        public static void main(String[] args) throws Exception {

            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
    new String[] { "/spring/context-annotation.xml","/spring/context-transaction.xml",
    "/spring/context-hibernate.xml",
    "/spring/context-quartz.xml"});

            System.out.println("start server....");

            while (true) {

                try {

                    Thread.sleep(900);

                } catch (InterruptedException ex) {

                }

            }

        };

    }

    去掉了系統(tǒng)的controller配置servlet.xml,運(yùn)行這個(gè)類(lèi)就可以了。

    在web-inf目錄下寫(xiě)一個(gè)command來(lái)啟動(dòng)這個(gè)java類(lèi):

    setlocal ENABLEDELAYEDEXPANSION

    if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)

    FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G

    Echo The Classpath definition is==== %CLASSPATH%

    set CLASSPATH=./classes;%CLASSPATH%

    java com.company.job.StartServer

    這個(gè)command需要把需要的jar(web-inf/lib中)包都放到classpath中。

    每次啟動(dòng)的時(shí)候執(zhí)行這個(gè)command就可以了。跟原來(lái)的應(yīng)用分開(kāi)了,調(diào)試起定時(shí)任務(wù)也不用影響到原來(lái)的應(yīng)用,還是比較方便的。部署的時(shí)候原樣拷貝一份,然后執(zhí)行這個(gè)command就好了,部署起來(lái)也比較方便。

     



    QQ:24889356
    posted on 2011-09-13 12:53 GhostZhang 閱讀(2660) 評(píng)論(3)  編輯  收藏

    Feedback

    # re: 一次定時(shí)任務(wù) 2011-09-14 08:55 tb
    恩 不錯(cuò)   回復(fù)  更多評(píng)論
      

    # re: 一次定時(shí)任務(wù) 2011-09-15 18:19 Mister4
    可以根據(jù)服務(wù)器的iP做個(gè)判斷  回復(fù)  更多評(píng)論
      

    # re: 一次定時(shí)任務(wù)[未登錄](méi) 2011-09-30 15:57 BucketLi
    這個(gè)簡(jiǎn)單處理方式有很多. 數(shù)據(jù)庫(kù)搞張任務(wù)表,放一條記錄,每個(gè)節(jié)點(diǎn)先取這條記錄(任務(wù)狀態(tài)是可執(zhí)行),然后再通過(guò)update將value+1并且更新?tīng)顟B(tài),帶上先前查詢(xún)出來(lái)的value作為查詢(xún)條件,這樣相當(dāng)于加了一把樂(lè)觀鎖,因?yàn)閿?shù)據(jù)庫(kù)底層是原子的,所以只有一臺(tái)機(jī)器會(huì)更新成功. 這樣就達(dá)到目的了. 還有稍微復(fù)雜點(diǎn)的是通過(guò)zk來(lái)維持一把任務(wù)鎖,這樣執(zhí)行任務(wù)的只有一臺(tái)機(jī)器,掛掉后另外一臺(tái)機(jī)器搶到鎖開(kāi)始做事情. 當(dāng)然還有其他方法  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久亚洲国产精品| 免费在线观看理论片| 国产免费内射又粗又爽密桃视频| 色窝窝免费一区二区三区| 亚洲综合一区二区精品导航 | 亚洲热线99精品视频| 香港一级毛片免费看| 最近2019中文免费字幕在线观看| 亚洲国产一级在线观看| 日韩久久无码免费毛片软件| 国产亚洲精品精品国产亚洲综合| 久久精品国产亚洲AV大全| 久久A级毛片免费观看| 91精品国产亚洲爽啪在线观看| 84pao国产成视频免费播放| 91亚洲va在线天线va天堂va国产 | 免费无码又爽又刺激网站直播| 中文字幕不卡亚洲| 亚洲精品宾馆在线精品酒店| 女人被免费视频网站| 男男黄GAY片免费网站WWW| 亚洲中文字幕久久精品无码喷水 | 国产啪精品视频网站免费尤物| 亚洲Av无码精品色午夜| 59pao成国产成视频永久免费| 亚洲啪啪免费视频| 国产成人高清精品免费鸭子| 九九免费观看全部免费视频| 精品国产免费观看| 亚洲综合图片小说区热久久| 福利免费观看午夜体检区| 牛牛在线精品观看免费正 | www永久免费视频| 亚洲国产精品久久久久网站 | 免费大黄网站在线观| 国产一区二区免费视频| 亚洲深深色噜噜狠狠网站| 亚洲日韩中文在线精品第一| 久久不见久久见免费视频7| 美女露隐私全部免费直播| 亚洲国产二区三区久久|