最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Quartz中的Job與JobDetail解析

 更新時間:2023年11月13日 10:00:59   作者:mumuwei_l  
這篇文章主要介紹了Quartz中的Job與JobDetail解析,你定義了一個實現(xiàn)Job接口的類,這個類僅僅表明該job需要完成什么類型的任務,除此之外,Quartz還需要知道該Job實例所包含的屬性;這將由JobDetail類來完成,需要的朋友可以參考下

前言

你定義了一個實現(xiàn)Job接口的類,這個類僅僅表明該job需要完成什么類型的任務

除此之外,Quartz還需要知道該Job實例所包含的屬性;這將由JobDetail類來完成。

Job

讓我們先看看Job的特征(nature)以及Job實例的生命期。不妨先回頭看看第1課中的代碼片段:

  // define the job and tie it to our HelloJob class
  JobDetail job = newJob(HelloJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .build();

  // Trigger the job to run now, and then every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

  // Tell quartz to schedule the job using our trigger
  sched.scheduleJob(job, trigger);

現(xiàn)在考慮這樣定義的作業(yè)類“HelloJob”:

  public class HelloJob implements Job {

    public HelloJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      System.err.println("Hello!  HelloJob is executing.");
    }
  }

可以看到,我們傳給scheduler一個JobDetail實例,因為我們在創(chuàng)建JobDetail時,將要執(zhí)行的job的類名傳給了JobDetail,所以scheduler就知道了要執(zhí)行何種類型的job;每次當scheduler執(zhí)行job時,在調(diào)用其execute(…)方法之前會創(chuàng)建該類的一個新的實例;執(zhí)行完畢,對該實例的引用就被丟棄了,實例會被垃圾回收;這種執(zhí)行策略帶來的一個后果是,job必須有一個無參的構(gòu)造函數(shù)(當使用默認的JobFactory時);另一個后果是,在job類中,不應該定義有狀態(tài)的數(shù)據(jù)屬性,因為在job的多次執(zhí)行中,這些屬性的值不會保留。

那么如何給job實例增加屬性或配置呢?如何在job的多次執(zhí)行中,跟蹤job的狀態(tài)呢?答案就是:JobDataMap,JobDetail對象的一部分。

JobDataMap

JobDataMap中可以包含不限量的(序列化的)數(shù)據(jù)對象,在job實例執(zhí)行的時候,可以使用其中的數(shù)據(jù);JobDataMap是Java Map接口的一個實現(xiàn),額外增加了一些便于存取基本類型的數(shù)據(jù)的方法。

將job加入到scheduler之前,在構(gòu)建JobDetail時,可以將數(shù)據(jù)放入JobDataMap,如下示例:

  // define the job and tie it to our DumbJob class
  JobDetail job = newJob(DumbJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .usingJobData("jobSays", "Hello World!")
      .usingJobData("myFloatValue", 3.141f)
      .build();

在job的執(zhí)行過程中,可以從JobDataMap中取出數(shù)據(jù),如下示例:

public class DumbJob implements Job {

    public DumbJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      JobKey key = context.getJobDetail().getKey();

      JobDataMap dataMap = context.getJobDetail().getJobDataMap();

      String jobSays = dataMap.getString("jobSays");
      float myFloatValue = dataMap.getFloat("myFloatValue");

      System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
    }
  }

如果你在job類中,為JobDataMap中存儲的數(shù)據(jù)的key增加set方法(如在上面示例中,增加setJobSays(String val)方法),那么Quartz的默認JobFactory實現(xiàn)在job被實例化的時候會自動調(diào)用這些set方法,這樣你就不需要在execute()方法中顯式地從map中取數(shù)據(jù)了。

在Job執(zhí)行時,JobExecutionContext中的JobDataMap為我們提供了很多的便利。它是JobDetail中的JobDataMap和Trigger中的JobDataMap的并集,但是如果存在相同的數(shù)據(jù),則后者會覆蓋前者的值。

下面的示例,在job執(zhí)行時,從JobExecutionContext中獲取合并后的JobDataMap:

    public class DumbJob implements Job {

        public DumbJob() {
        }

        public void execute(JobExecutionContext context)
          throws JobExecutionException
        {
            JobKey key = context.getJobDetail().getKey();

            JobDataMap dataMap = context.getMergedJobDataMap();  // Note the difference from the previous example

            String jobSays = dataMap.getString("jobSays");
            float myFloatValue = dataMap.getFloat("myFloatValue");
            ArrayList state = (ArrayList)dataMap.get("myStateData");
            state.add(new Date());

            System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
        }
    }

如果你希望使用JobFactory實現(xiàn)數(shù)據(jù)的自動“注入”,則示例代碼為:

  public class DumbJob implements Job {


    String jobSays;
    float myFloatValue;
    ArrayList state;

    public DumbJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      JobKey key = context.getJobDetail().getKey();

      JobDataMap dataMap = context.getMergedJobDataMap();  // Note the difference from the previous example

      state.add(new Date());

      System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
    }

    public void setJobSays(String jobSays) {
      this.jobSays = jobSays;
    }

    public void setMyFloatValue(float myFloatValue) {
      myFloatValue = myFloatValue;
    }

    public void setState(ArrayList state) {
      state = state;
    }

  }

Job實例

你可以只創(chuàng)建一個job類,然后創(chuàng)建多個與該job關(guān)聯(lián)的JobDetail實例,每一個實例都有自己的屬性集和JobDataMap,最后,將所有的實例都加到scheduler中。

比如,你創(chuàng)建了一個實現(xiàn)Job接口的類“SalesReportJob”。該job需要一個參數(shù)(通過JobdataMap傳入),表示負責該銷售報告的銷售員的名字。因此,你可以創(chuàng)建該job的多個實例(JobDetail),比如“SalesReportForJoe”、“SalesReportForMike”,將“joe”和“mike”作為JobDataMap的數(shù)據(jù)傳給對應的job實例。

當一個trigger被觸發(fā)時,與之關(guān)聯(lián)的JobDetail實例會被加載,JobDetail引用的job類通過配置在Scheduler上的JobFactory進行初始化。默認的JobFactory實現(xiàn),僅僅是調(diào)用job類的newInstance()方法,然后嘗試調(diào)用JobDataMap中的key的setter方法。你也可以創(chuàng)建自己的JobFactory實現(xiàn),比如讓你的IOC或DI容器可以創(chuàng)建/初始化job實例。

在Quartz的描述語言中,我們將保存后的JobDetail稱為“job定義”或者“JobDetail實例”,將一個正在執(zhí)行的job稱為“job實例”或者“job定義的實例”。當我們使用“job”時,一般指代的是job定義,或者JobDetail;當我們提到實現(xiàn)Job接口的類時,通常使用“job類”。

Job狀態(tài)與并發(fā)

關(guān)于job的狀態(tài)數(shù)據(jù)(即JobDataMap)和并發(fā)性,還有一些地方需要注意。在job類上可以加入一些注解,這些注解會影響job的狀態(tài)和并發(fā)性。

@DisallowConcurrentExecution:將該注解加到job類上,告訴Quartz不要并發(fā)地執(zhí)行同一個job定義(這里指特定的job類)的多個實例。請注意這里的用詞。拿前一小節(jié)的例子來說,如果“SalesReportJob”類上有該注解,則同一時刻僅允許執(zhí)行一個“SalesReportForJoe”實例,但可以并發(fā)地執(zhí)行“SalesReportForMike”類的一個實例。所以該限制是針對JobDetail的,而不是job類的。但是我們認為(在設(shè)計Quartz的時候)應該將該注解放在job類上,因為job類的改變經(jīng)常會導致其行為發(fā)生變化。

@PersistJobDataAfterExecution:將該注解加在job類上,告訴Quartz在成功執(zhí)行了job類的execute方法后(沒有發(fā)生任何異常),更新JobDetail中JobDataMap的數(shù)據(jù),使得該job(即JobDetail)在下一次執(zhí)行的時候,JobDataMap中是更新后的數(shù)據(jù),而不是更新前的舊數(shù)據(jù)。和 @DisallowConcurrentExecution注解一樣,盡管注解是加在job類上的,但其限制作用是針對job實例的,而不是job類的。由job類來承載注解,是因為job類的內(nèi)容經(jīng)常會影響其行為狀態(tài)(比如,job類的execute方法需要顯式地“理解”其”狀態(tài)“)。

如果你使用了@PersistJobDataAfterExecution注解,我們強烈建議你同時使用@DisallowConcurrentExecution注解,因為當同一個job(JobDetail)的兩個實例被并發(fā)執(zhí)行時,由于競爭,JobDataMap中存儲的數(shù)據(jù)很可能是不確定的。

到此這篇關(guān)于Quartz中的Job與JobDetail解析的文章就介紹到這了,更多相關(guān)Job與JobDetail解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Dubbo?LoadBalance基于權(quán)重的隨機負載均衡算法提高服務性能

    Dubbo?LoadBalance基于權(quán)重的隨機負載均衡算法提高服務性能

    這篇文章主要為大家介紹了Dubbo?LoadBalance基于權(quán)重的隨機負載均衡算法提高服務性能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-10-10
  • java 代理機制的實例詳解

    java 代理機制的實例詳解

    這篇文章主要介紹了java 代理機制的實例詳解的相關(guān)資料,這里說明下如何實現(xiàn)代理機制,幫助大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • 深入探究SpringBoot攔截器的自定義設(shè)計與實現(xiàn)全攻略

    深入探究SpringBoot攔截器的自定義設(shè)計與實現(xiàn)全攻略

    攔截器是Spring框架提供的核心功能之?,主要用來攔截用戶的請求,在指定方法前后,根據(jù)業(yè)務需要執(zhí)行預先設(shè)定的代碼,本文將給大家和大家一起深入探究SpringBoot攔截器的自定義設(shè)計與實現(xiàn),需要的朋友可以參考下
    2024-05-05
  • 詳解Spring Boot使用系統(tǒng)參數(shù)表提升系統(tǒng)的靈活性

    詳解Spring Boot使用系統(tǒng)參數(shù)表提升系統(tǒng)的靈活性

    Spring Boot項目中常有一些相對穩(wěn)定的參數(shù)設(shè)置項,其作用范圍是系統(tǒng)級的或模塊級的,這些參數(shù)稱為系統(tǒng)參數(shù)。這些變量以參數(shù)形式進行配置,從而提高變動和擴展的靈活性,保持代碼的穩(wěn)定性
    2021-06-06
  • Java性能的十一個用法分享

    Java性能的十一個用法分享

    這篇文章主要介紹了Java性能的十一個用法,需要的朋友可以參考下
    2014-10-10
  • Struts 2 配置Action詳解

    Struts 2 配置Action詳解

    本篇文章主要介紹了Struts 2 配置Action詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • mybatis中如何使用小于號

    mybatis中如何使用小于號

    這篇文章主要介紹了mybatis中如何使用小于號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • springboot使用攔截器判斷是否登錄

    springboot使用攔截器判斷是否登錄

    這篇文章主要介紹了springboot使用攔截器判斷是否登錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • IDEA使用SequenceDiagram插件繪制時序圖的方法

    IDEA使用SequenceDiagram插件繪制時序圖的方法

    這篇文章主要介紹了IDEA使用SequenceDiagram插件繪制時序圖的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java多線程之線程安全問題詳細解析

    Java多線程之線程安全問題詳細解析

    這篇文章主要給大家介紹了關(guān)于Java多線程之線程安全問題的相關(guān)資料,Java多線程中線程安全問題是一個常見的問題,因為多個線程可能同時訪問共享的資源,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-11-11

最新評論

上饶县| 宁蒗| 繁峙县| 巴马| 青铜峡市| 九龙坡区| 南靖县| 隆回县| 九龙县| 阳新县| 巴塘县| 汝阳县| 哈尔滨市| 滨州市| 汕尾市| 乌审旗| 栾城县| 萨迦县| 灌云县| 奎屯市| 屏南县| 肃宁县| 沧州市| 贵定县| 筠连县| 阿拉善右旗| 通河县| 莎车县| 池州市| 成都市| 石台县| 宝丰县| 牙克石市| 虞城县| 宣威市| 汽车| 措美县| 阿克陶县| 浠水县| 什邡市| 桂东县|