皮皮左耳

          evoleht

           

          2010年8月11日

          Scheduler定時器

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

                      int m = ips.length;
                      int n = tablenames.length;
                      //向作業內設置要傳入的參數
                     
          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]);
                          }
                      }
                     
          //建立觸發器,判斷何時觸發該作業,參數為觸發器的名稱,觸發器分組,作業名稱,作業分組,時間設定
                     
          Trigger trigger = new CronTrigger("ReceiverOnTimeTriggerd",
                                                        scheduler.DEFAULT_GROUP,
                                                        "ReceiveOnTimed",
                                                        scheduler.DEFAULT_GROUP, time);
                     
          //將作業和觸發器添加到調度器
                     
          scheduler.scheduleJob(jobDetail, trigger);
                     
          //按照設置開始調度
                      scheduler.start();
            }catch(Exception e){
             e.printStackTrace();
            }
           }
           
          具體作業類的處理:
           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(){
           }
           
          //作業具體實現的功能
           public void
          execute(JobExecutionContext context) throws
              JobExecutionException
          {
               try {
                     
                      //建立JobDataMap對象,用來接收傳遞的參數
                     
          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);
                               
          //啟動線程
                              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) | 評論 (0)編輯 收藏

          quartz-scheduler 定時器

                  在闡述quartz是個什么東西之前,我先說個事。很多時候,我們經常在臺歷上標注出,某一天是某人的生日,某一天有某個重要的事情,給自己一個提醒。一個臺歷加上所要做的事情的內容,就是一個scheduler。計算機系統,是幫助人們完成既定事務的。所以,我們希望,把“日程規劃+具體事務”,交給系統,系統就能按照我們的要求自動去工作。
              好了,quartz就是這么一個東西。我們只需要定義好時間表,并對應指定的操作,它就能夠按照我們的要求在指定時間驅動指定的工作,如此簡單。

                 quartz中,所有需要驅動的工作,都是實現job接口的類。job接口很簡單,就只有一個excute()方法,只要把這個類交給quartz,它就會自動去執行這個方法。方法里面定義的就是我們真正需要進行的工作,恩,這都沒有什么問題。

                  現在的問題在于,很多時候我們需要執行的工作類,是外部類,并沒有繼承job接口。也就是說,我們希望quartz能夠驅動任意的類的任意方法,這該怎么辦?這也是我第一階段的一個小目標。

              一開始我想改變quartz的驅動方式,也就是改變runshell里面的東西,后來發現,這太復雜了,這是quartz最核心的東西,動一發而牽全身。我只是想利用quartz的優勢,并不想大規模的改動。
              走了不少彎路之后,想了一個不錯的方案。就是,我們只需要定義好所需要的類名、方法名、方法需要的參數,然后利用reflect,來實例化類,然后invoke指定方法。而把這些工作放在一個通用的job模板中的excute方法,這樣,我們只需要把指定參數傳入這個通用job模板,然后直接驅動此job就能實現我們上面的目標。
              參數傳遞采用的方案是:
              1、數據源。把我們需要指定的信息以配置文件的方式給出,主要是,工作組、工作名、工作對應的類,指定的方法,所需的參數。
              2、數據傳遞。寫一個metadata用來包裝這些信息,這樣做是為了將來管理的方便。然后用metadata來初始化jobdetail,重寫工作組、工作名,將類信息保存在jobDataMap中,然后在執行excute的時候,再把這些信息取出來。
              3、工作執行。利用reflect技術,執行指定類的指定方式。
              4、數據返回。excute結束之前,把需要返回的數據放在jobDataMap中,scheduler結束之前,把這些數據從jobDataMap中取出來。
              完美的方案,開心一下!

              下一步研究quartz的另外一個大部分 時間表。

              quartz的一些基本概念

                  Job 與 JobDetail

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

                  Trigger時間調度

                  相對于job,trigger簡單一些。所謂的時間調度,就是設置job執行的時間表。Trigger主要分為SimpleTrigger和CronTrigger兩大類。前者主要是以1/1000
          為單位的簡單時間,可是設置startTime、endTime、repeatCount、repeatInterval等主要參數。CronTrigger的詳細用法參看quartz文檔的的CronTriggers Tutorial。
                  scheduler.schedulerJob(jobDetail, trigger);將JobDetail和對應的Trigger部署到scheduler中,然后根據trigger的定義,自動執行指定job。
                  Calendar這個類用來標識出特殊的時間,scheduler根據trigger執行job的時候,如果遇到這些標識出的特殊時間則不執行job。Calendar具體的接口有BaseCalendar、AnnualCalendar、HolidayCalendar、MonthlyCalendar、WeeklyCalendar等等。calendar的具體用法參看quartz的文檔。
                  Misfire Instruction....設定當trigger錯過了觸發時刻的時候需要采取的處理策略
                  TriggerUtils相當于一個trigger factory,方便我們取得特殊trigger的實例,而不用自己去構造。

                  Listener是用來監聽quartz的執行過程的,主要有JobListener,TriggerListener,SchedulerListener。joblistener監聽一個job在quartz中執行的待執行,禁止執行,執行完畢三個狀態。TriggerListener監聽trigger觸發、完成、錯過、禁止四個狀態。SchedulerListener監聽scheduler執行過程的一些狀態,具體參看SchedulerListener的源代碼。

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

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

          【java】位、字節、漢字、字符的關系

          bit、byte、位、字節、漢字的關系


                  1 bit     = 1  二進制數據
                  1 byte  = 8  bit
                  1 字母 = 1  byte = 8 bit
                  1 漢字 = 2  byte = 16 bit


          1. bit:位
              一個二進制數據0或1,是1bit;

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

          3. 一個英文字符占一個字節;
              1 字母 = 1 byte = 8 bit

          4. 一個漢字占2個字節;
              1 漢字 = 2 byte = 16 bit

          5. 標點符號
              A>.  漢字輸入狀態下,默認為全角輸入方式;
              B>.  英文輸入狀態下,默認為半角輸入方式;

              C>.  全角輸入方式下,標點符號占2字節;
              D>.  半角輸入方式下,標點符號占1字節;

              故:漢字輸入狀態下的字符,占2個字節 (但不排除,自己更改了默認設置);
                      英文輸入狀態下的字符,占1個字節 (但不排除,自己更改了默認設置);

           

                  老美在發明電腦時,肯定以自己的英文字母--即他們自認為的字符為最小的存儲計量單位,于是也就有了不規范的1字符=1byte, 豈不知還有我們偉大的漢字計量單位,NND,一個漢字也是一個字符,我們的1漢字字符就等于2byte,后來,他們可能意識到這個尷尬的問題,于是又標榜為:一個字母為一個標準字符,去球吧,誰整天沒事說個字符還“標準字符”,所以啊,個人認為:字符,不能用于標準的計量單位。
          --------------------------------
          補充:
              計算機對各國語言的支持度,可分為以下三個階段,如圖:


          更詳細參考:http://www.regexlab.com/zh/encoding.htm 


          轉自http://www.aygfsteel.com/myfly/archive/2008/09/24/230875.html

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

          僅列出標題  

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 丰顺县| 靖宇县| 邹平县| 南陵县| 山东| 龙井市| 礼泉县| 建平县| 永康市| 新乡市| 余干县| 柳江县| 威远县| 贵定县| 祁阳县| 崇阳县| 依兰县| 石嘴山市| 鞍山市| 华阴市| 安化县| 陵川县| 施秉县| 晋江市| 周至县| 涡阳县| 个旧市| 滁州市| 榆林市| 清徐县| 安仁县| 延川县| 教育| 张北县| 瑞金市| 汤阴县| 光泽县| 惠来县| 琼海市| 博爱县| 玉山县|