皮皮左耳

          evoleht

           

          2010年8月11日

          Scheduler定時(shí)器

          首先添加所需要的類(lèi)包:quartz-1.5.2.jar,quartz-all-1.5.2.jar,quartz-jboss-1.5.2.jar 
          //設(shè)置定時(shí)作業(yè)
           public void startScheduler(HttpServletRequest requests)throws SchedulerException{
            try{
             
          //建立作業(yè)調(diào)度器
             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
             //判斷作業(yè)調(diào)度內(nèi)是否有作業(yè),如果有將其刪除
             
          if (!scheduler.isShutdown()) {
                          scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
                      }
             //刪除調(diào)度器的作業(yè)后,新建一個(gè)我們現(xiàn)在要完成的作業(yè),該作業(yè)所需要的類(lèi)是ReceiveJobd.class,作業(yè)名字是ReceiveOnTimes,所屬分組是Scheduler.DEFAULT_GROUP
                     
          JobDetail jobDetail = new JobDetail("ReceiveOnTimed",
                                                          Scheduler.DEFAULT_GROUP,
                                                          ReceiveJobd.class);

                      int m = ips.length;
                      int n = tablenames.length;
                      //向作業(yè)內(nèi)設(shè)置要傳入的參數(shù)
                     
          jobDetail.getJobDataMap().put("scheduler", scheduler);
                      jobDetail.getJobDataMap().put("ipLength", m);
                      jobDetail.getJobDataMap().put("tablenameLength", n);
                      jobDetail.getJobDataMap().put("wcx",wc);
                      for (int i = 0; i < m; i++) {
                          jobDetail.getJobDataMap().put("ip" + i, ips[i]);
                          for (int j = 0; j < n; j++) {
                              jobDetail.getJobDataMap().put("tablename" + j, tablenames[j]);
                          }
                      }
                     
          //建立觸發(fā)器,判斷何時(shí)觸發(fā)該作業(yè),參數(shù)為觸發(fā)器的名稱(chēng),觸發(fā)器分組,作業(yè)名稱(chēng),作業(yè)分組,時(shí)間設(shè)定
                     
          Trigger trigger = new CronTrigger("ReceiverOnTimeTriggerd",
                                                        scheduler.DEFAULT_GROUP,
                                                        "ReceiveOnTimed",
                                                        scheduler.DEFAULT_GROUP, time);
                     
          //將作業(yè)和觸發(fā)器添加到調(diào)度器
                     
          scheduler.scheduleJob(jobDetail, trigger);
                     
          //按照設(shè)置開(kāi)始調(diào)度
                      scheduler.start();
            }catch(Exception e){
             e.printStackTrace();
            }
           }
           
          具體作業(yè)類(lèi)的處理:
           package com.bodhiya.schsystem.business;

          import org.quartz.Job;
          import org.quartz.JobDataMap;
          import org.quartz.JobExecutionContext;
          import org.quartz.JobExecutionException;
          import org.quartz.Scheduler;
          import org.springframework.web.context.WebApplicationContext;

          public class ReceiveJobd implements Job{
           public void ReceiveJobd(){
           }
           
          //作業(yè)具體實(shí)現(xiàn)的功能
           public void
          execute(JobExecutionContext context) throws
              JobExecutionException
          {
               try {
                     
                      //建立JobDataMap對(duì)象,用來(lái)接收傳遞的參數(shù)
                     
          JobDataMap dataMap = context.getMergedJobDataMap();
                      int ipLength = dataMap.getInt("ipLength");
                      int tablenameLength = dataMap.getInt("tablenameLength");
                     
          WebApplicationContext wc=(WebApplicationContext)dataMap.get("wcx");
                     
                      String ip = "";
                      String tablename = "";
                      for (int i = 0; i < ipLength; i++) {
                          ip = dataMap.getString("ip" + i);
                          for (int j = 0; j < tablenameLength; j++) {
                              tablename = dataMap.getString("tablename" + j);
                              ExchangeAccess ea=new ExchangeAccess(ip,tablename,wc);
                               
          //啟動(dòng)線程
                              ea.start();
                          }
                      }
                     
          Scheduler scheduler = (Scheduler) dataMap.get("scheduler");
                      scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
                  } catch (Exception ex) {
                      ex.printStackTrace();
                  }
           }
          }

          posted @ 2010-08-11 18:40 皮卡諾 閱讀(313) | 評(píng)論 (0)編輯 收藏

          quartz-scheduler 定時(shí)器

                  在闡述quartz是個(gè)什么東西之前,我先說(shuō)個(gè)事。很多時(shí)候,我們經(jīng)常在臺(tái)歷上標(biāo)注出,某一天是某人的生日,某一天有某個(gè)重要的事情,給自己一個(gè)提醒。一個(gè)臺(tái)歷加上所要做的事情的內(nèi)容,就是一個(gè)scheduler。計(jì)算機(jī)系統(tǒng),是幫助人們完成既定事務(wù)的。所以,我們希望,把“日程規(guī)劃+具體事務(wù)”,交給系統(tǒng),系統(tǒng)就能按照我們的要求自動(dòng)去工作。
              好了,quartz就是這么一個(gè)東西。我們只需要定義好時(shí)間表,并對(duì)應(yīng)指定的操作,它就能夠按照我們的要求在指定時(shí)間驅(qū)動(dòng)指定的工作,如此簡(jiǎn)單。

                 quartz中,所有需要驅(qū)動(dòng)的工作,都是實(shí)現(xiàn)job接口的類(lèi)。job接口很簡(jiǎn)單,就只有一個(gè)excute()方法,只要把這個(gè)類(lèi)交給quartz,它就會(huì)自動(dòng)去執(zhí)行這個(gè)方法。方法里面定義的就是我們真正需要進(jìn)行的工作,恩,這都沒(méi)有什么問(wèn)題。

                  現(xiàn)在的問(wèn)題在于,很多時(shí)候我們需要執(zhí)行的工作類(lèi),是外部類(lèi),并沒(méi)有繼承job接口。也就是說(shuō),我們希望quartz能夠驅(qū)動(dòng)任意的類(lèi)的任意方法,這該怎么辦?這也是我第一階段的一個(gè)小目標(biāo)。

              一開(kāi)始我想改變quartz的驅(qū)動(dòng)方式,也就是改變r(jià)unshell里面的東西,后來(lái)發(fā)現(xiàn),這太復(fù)雜了,這是quartz最核心的東西,動(dòng)一發(fā)而牽全身。我只是想利用quartz的優(yōu)勢(shì),并不想大規(guī)模的改動(dòng)。
              走了不少?gòu)澛分螅肓艘粋€(gè)不錯(cuò)的方案。就是,我們只需要定義好所需要的類(lèi)名、方法名、方法需要的參數(shù),然后利用reflect,來(lái)實(shí)例化類(lèi),然后invoke指定方法。而把這些工作放在一個(gè)通用的job模板中的excute方法,這樣,我們只需要把指定參數(shù)傳入這個(gè)通用job模板,然后直接驅(qū)動(dòng)此job就能實(shí)現(xiàn)我們上面的目標(biāo)。
              參數(shù)傳遞采用的方案是:
              1、數(shù)據(jù)源。把我們需要指定的信息以配置文件的方式給出,主要是,工作組、工作名、工作對(duì)應(yīng)的類(lèi),指定的方法,所需的參數(shù)。
              2、數(shù)據(jù)傳遞。寫(xiě)一個(gè)metadata用來(lái)包裝這些信息,這樣做是為了將來(lái)管理的方便。然后用metadata來(lái)初始化jobdetail,重寫(xiě)工作組、工作名,將類(lèi)信息保存在jobDataMap中,然后在執(zhí)行excute的時(shí)候,再把這些信息取出來(lái)。
              3、工作執(zhí)行。利用reflect技術(shù),執(zhí)行指定類(lèi)的指定方式。
              4、數(shù)據(jù)返回。excute結(jié)束之前,把需要返回的數(shù)據(jù)放在jobDataMap中,scheduler結(jié)束之前,把這些數(shù)據(jù)從jobDataMap中取出來(lái)。
              完美的方案,開(kāi)心一下!

              下一步研究quartz的另外一個(gè)大部分 時(shí)間表。

              quartz的一些基本概念

                  Job 與 JobDetail

                  Job是quartz中最基本的概念了,Job做為一個(gè)接口只有一個(gè)execute()方法等待實(shí)現(xiàn),理論上所有用quartz執(zhí)行的job都需要實(shí)現(xiàn)這個(gè)接口,但是現(xiàn)在大多數(shù)的系統(tǒng)都不會(huì)服從這種約束,而希望能夠更自由的調(diào)用原有系統(tǒng)中的類(lèi)的方法。實(shí)現(xiàn)自由調(diào)用,有兩個(gè)途徑,我上一節(jié)總結(jié)中的那個(gè)方案是一個(gè)簡(jiǎn)單的途徑,另外一個(gè)途徑就是借助于spring的class bean,這個(gè)將在后面介紹。
                  StatefullJob接口: 無(wú)狀態(tài)任務(wù)對(duì)應(yīng)的JobDataMap可以認(rèn)為是只讀的,而有狀態(tài)的任務(wù)在多次執(zhí)行過(guò)程中保留對(duì)JobDataMap所作的修改,一個(gè)后果是有狀態(tài)任務(wù)無(wú)法被并發(fā)執(zhí)行。上面這句話是抄襲的,事實(shí)上我還是不是很清楚二者究竟的區(qū)別?
              
                  JobDetail是用來(lái)包裝Job實(shí)例的具體細(xì)節(jié)的。Job以class的方式傳入JobDetail,quartz會(huì)自動(dòng)實(shí)例化Job類(lèi)的。同時(shí)需要規(guī)定job的name和group,在jobdetail的validate()下,一個(gè)job是必須有name和group屬性,并且二者組合標(biāo)示唯一的job。JobDetail中的一些重要數(shù)據(jù)存放在JobDataMap中,這個(gè)map可以用來(lái)在控制程序和job內(nèi)傳遞需要傳遞的參數(shù)。
                  JobDetail還有三個(gè)重要的boolean值的屬性,分別是durability、volatility、shouldRecover。這三個(gè)屬性默認(rèn)是false,主要在數(shù)據(jù)庫(kù)操作的時(shí)候起作用。

                  Trigger時(shí)間調(diào)度

                  相對(duì)于job,trigger簡(jiǎn)單一些。所謂的時(shí)間調(diào)度,就是設(shè)置job執(zhí)行的時(shí)間表。Trigger主要分為SimpleTrigger和CronTrigger兩大類(lèi)。前者主要是以1/1000
          為單位的簡(jiǎn)單時(shí)間,可是設(shè)置startTime、endTime、repeatCount、repeatInterval等主要參數(shù)。CronTrigger的詳細(xì)用法參看quartz文檔的的CronTriggers Tutorial。
                  scheduler.schedulerJob(jobDetail, trigger);將JobDetail和對(duì)應(yīng)的Trigger部署到scheduler中,然后根據(jù)trigger的定義,自動(dòng)執(zhí)行指定job。
                  Calendar這個(gè)類(lèi)用來(lái)標(biāo)識(shí)出特殊的時(shí)間,scheduler根據(jù)trigger執(zhí)行job的時(shí)候,如果遇到這些標(biāo)識(shí)出的特殊時(shí)間則不執(zhí)行job。Calendar具體的接口有BaseCalendar、AnnualCalendar、HolidayCalendar、MonthlyCalendar、WeeklyCalendar等等。calendar的具體用法參看quartz的文檔。
                  Misfire Instruction....設(shè)定當(dāng)trigger錯(cuò)過(guò)了觸發(fā)時(shí)刻的時(shí)候需要采取的處理策略
                  TriggerUtils相當(dāng)于一個(gè)trigger factory,方便我們?nèi)〉锰厥鈚rigger的實(shí)例,而不用自己去構(gòu)造。

                  Listener是用來(lái)監(jiān)聽(tīng)quartz的執(zhí)行過(guò)程的,主要有JobListener,TriggerListener,SchedulerListener。joblistener監(jiān)聽(tīng)一個(gè)job在quartz中執(zhí)行的待執(zhí)行,禁止執(zhí)行,執(zhí)行完畢三個(gè)狀態(tài)。TriggerListener監(jiān)聽(tīng)trigger觸發(fā)、完成、錯(cuò)過(guò)、禁止四個(gè)狀態(tài)。SchedulerListener監(jiān)聽(tīng)scheduler執(zhí)行過(guò)程的一些狀態(tài),具體參看SchedulerListener的源代碼。

          轉(zhuǎn)自:http://flyinglife.javaeye.com/blog/74553
          另:http://forums.opensymphony.com/category.jspa?categoryID=8。
          另外推薦一個(gè)java的blog:http://www.aygfsteel.com/javaora/。

          posted @ 2010-08-11 18:28 皮卡諾 閱讀(1018) | 評(píng)論 (0)編輯 收藏

          【java】位、字節(jié)、漢字、字符的關(guān)系

          bit、byte、位、字節(jié)、漢字的關(guān)系


                  1 bit     = 1  二進(jìn)制數(shù)據(jù)
                  1 byte  = 8  bit
                  1 字母 = 1  byte = 8 bit
                  1 漢字 = 2  byte = 16 bit


          1. bit:位
              一個(gè)二進(jìn)制數(shù)據(jù)0或1,是1bit;

          2. byte:字節(jié)
              存儲(chǔ)空間的基本計(jì)量單位,如:MySQL中定義 VARCHAR(45)  即是指 45個(gè)字節(jié);
              1 byte = 8 bit

          3. 一個(gè)英文字符占一個(gè)字節(jié);
              1 字母 = 1 byte = 8 bit

          4. 一個(gè)漢字占2個(gè)字節(jié);
              1 漢字 = 2 byte = 16 bit

          5. 標(biāo)點(diǎn)符號(hào)
              A>.  漢字輸入狀態(tài)下,默認(rèn)為全角輸入方式;
              B>.  英文輸入狀態(tài)下,默認(rèn)為半角輸入方式;

              C>.  全角輸入方式下,標(biāo)點(diǎn)符號(hào)占2字節(jié);
              D>.  半角輸入方式下,標(biāo)點(diǎn)符號(hào)占1字節(jié);

              故:漢字輸入狀態(tài)下的字符,占2個(gè)字節(jié) (但不排除,自己更改了默認(rèn)設(shè)置);
                      英文輸入狀態(tài)下的字符,占1個(gè)字節(jié) (但不排除,自己更改了默認(rèn)設(shè)置);

           

                  老美在發(fā)明電腦時(shí),肯定以自己的英文字母--即他們自認(rèn)為的字符為最小的存儲(chǔ)計(jì)量單位,于是也就有了不規(guī)范的1字符=1byte, 豈不知還有我們偉大的漢字計(jì)量單位,NND,一個(gè)漢字也是一個(gè)字符,我們的1漢字字符就等于2byte,后來(lái),他們可能意識(shí)到這個(gè)尷尬的問(wèn)題,于是又標(biāo)榜為:一個(gè)字母為一個(gè)標(biāo)準(zhǔn)字符,去球吧,誰(shuí)整天沒(méi)事說(shuō)個(gè)字符還“標(biāo)準(zhǔn)字符”,所以啊,個(gè)人認(rèn)為:字符,不能用于標(biāo)準(zhǔn)的計(jì)量單位。
          --------------------------------
          補(bǔ)充:
              計(jì)算機(jī)對(duì)各國(guó)語(yǔ)言的支持度,可分為以下三個(gè)階段,如圖:


          更詳細(xì)參考:http://www.regexlab.com/zh/encoding.htm 


          轉(zhuǎn)自http://www.aygfsteel.com/myfly/archive/2008/09/24/230875.html

          posted @ 2010-08-11 10:50 皮卡諾 閱讀(861) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題  

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 雷波县| 报价| 乳源| 准格尔旗| 天峻县| 杭锦后旗| 巴中市| 南平市| 彭泽县| 涿鹿县| 江达县| 孟津县| 濮阳市| 凉山| 炉霍县| 六安市| 保康县| 宣汉县| 前郭尔| 孙吴县| 铜陵市| 泰来县| 高安市| 蒙阴县| 扬中市| 乳源| 晋宁县| 商城县| 保康县| 怀安县| 贵定县| 海丰县| 南陵县| 香河县| 林芝县| 平和县| 吉隆县| 富锦市| 宁波市| 普格县| 马关县|