欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中Quartz的簡單使用

 更新時間:2023年04月12日 14:33:28   作者:VipSoft  
Quartz?是一個開源的作業(yè)調(diào)度框架,它完全由?Java?寫成,并設計用于?J2SE?和?J2EE?應用中。這篇文章主要通過示例和大家講講Quartz的簡單使用,需要的可以參考一下

Scheduler 每次執(zhí)行,都會根據(jù)JobDetail創(chuàng)建一個新的Job實例,這樣就可以規(guī)避并發(fā)訪問的問題(jobDetail的實例也是新的)

Quzrtz 定時任務默認都是并發(fā)執(zhí)行,不會等待上一次任務執(zhí)行完畢,只要間隔時間到就會執(zhí)行,如果定時任務執(zhí)行太長,會長時間占用資源,導致其它任務堵塞

@DisallowConcurrentExecution: job類上,禁止并發(fā)地執(zhí)行同一個job定義 (JobDetail定義的)的多個實例。

  • scheduler:可以理解為定時任務的工作容器或者說是工作場所,所有定時任務都是放在里面工作,可以開啟和停止。
  • trigger:可以理解為是定時任務任務的工作規(guī)則配置,例如說,沒個幾分鐘調(diào)用一次,或者說指定每天那個時間點執(zhí)行。
  • jobDetail:定時任務的信息,例如配置定時任務的名字,群組之類的。
  • job:定時任務的真正的業(yè)務處理邏輯的地方。

簡單示例

TestClient.Java

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")  //設置JOB的名字和組
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

TaskJob.Java

import cn.hutool.core.date.DateUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("TaskJob => " + DateUtil.now());
    }
}

usingJobData

通過 usingJobData 往定時任務中傳遞參數(shù)

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

TaskJob.java

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        JobDataMap triggerMap = context.getTrigger().getJobDataMap();
        JobDataMap mergeMap = context.getMergedJobDataMap();


        System.out.println("jobDataMap => " + jobDataMap.getString("job"));
        System.out.println("triggerMap => " + triggerMap.getString("trigger"));
        System.out.println("mergeMap => " + mergeMap.getString("trigger"));
    }
}

通過屬性賦值

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .usingJobData("name","jobDetail1.name.Value") //通過 setName 自動賦值
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,會覆蓋 JobDetail
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}
import org.quartz.*;

public class TaskJob implements Job {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("name => " + name);
    }
}

非并發(fā)執(zhí)行

@DisallowConcurrentExecution job類上,禁止并發(fā)地執(zhí)行同一個job定義 (JobDetail定義的)的多個實例。

import cn.hutool.core.date.DateUtil;
import org.quartz.*;

@DisallowConcurrentExecution
public class TaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("Time => " + DateUtil.now());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@PersistJobDataAfterExecution

持久化JobDetail中的JobDataMap(對 trigger 中的 datamap 無效),如果一個任務不是

import cn.hutool.core.date.DateUtil;

import org.quartz.*;

//持久化JobDetail中的JobDataMap(對 trigger 中的 datamap 無效),如果一個任務不是
@PersistJobDataAfterExecution
public class TaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) {
        JobDataMap triggerMap = context.getJobDetail().getJobDataMap();
        triggerMap.put("count", triggerMap.getInt("count") + 1);
        System.out.println("Time => " + DateUtil.now() + " count =>" + triggerMap.getInt("count"));

    }
}

Client

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .usingJobData("name","jobDetail1.name.Value") //通過 setName 自動賦值
                .usingJobData("count",0) //通過 setName 自動賦值
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,會覆蓋 JobDetail
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

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

相關文章

  • SpringMVC使用@ExceptionHandler注解在Controller中處理異常

    SpringMVC使用@ExceptionHandler注解在Controller中處理異常

    這篇文章主要為大家介紹了SpringMVC使用@ExceptionHandler注解在Controller中處理異常示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 基于spring AOP @Around @Before @After的區(qū)別說明

    基于spring AOP @Around @Before @After的區(qū)別說明

    這篇文章主要介紹了基于spring AOP @Around @Before @After的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Struts2學習筆記(3)-DMI動態(tài)調(diào)用方式

    Struts2學習筆記(3)-DMI動態(tài)調(diào)用方式

    本文主要介紹Struts2的DMI動態(tài)調(diào)用的兩種方式,簡單實用,希望能給大家做一個參考。
    2016-06-06
  • Java利用ffmpeg實現(xiàn)視頻MP4轉m3u8

    Java利用ffmpeg實現(xiàn)視頻MP4轉m3u8

    本文綜合了下網(wǎng)上教程,從ffmpeg工具轉碼,ffmpeg視頻播放,java語言操控ffmpeg轉碼,轉碼后視頻上傳阿里云oss,四個方面完整記錄下這個流程,需要的朋友可以參考下
    2024-02-02
  • 詳細介紹Java函數(shù)式接口

    詳細介紹Java函數(shù)式接口

    函數(shù)式接口在Java中是指有且僅有一個抽象方法的接口。當然接口中可以包含其他的方法默認、靜態(tài)、私有,具體內(nèi)容請參考下面文章內(nèi)容
    2021-09-09
  • Java實現(xiàn)視頻自定義裁剪功能

    Java實現(xiàn)視頻自定義裁剪功能

    這篇文章主要介紹了如何通過java實現(xiàn)視頻裁剪,可以將視頻按照自定義尺寸進行裁剪,文中的示例代碼簡潔易懂,感興趣的可以了解一下
    2022-01-01
  • MyBatis入門介紹(超簡單)

    MyBatis入門介紹(超簡單)

    mybatis是Java的持久層框架, JAVA操作數(shù)據(jù)庫是通過jdbc來操作的,而mybatis是對jdbc的封裝。下文給大家介紹mybatis入門知識,感興趣的朋友參考下吧
    2017-08-08
  • java網(wǎng)上商城項目第1篇之用戶注冊模塊

    java網(wǎng)上商城項目第1篇之用戶注冊模塊

    這篇文章主要為大家詳細介紹了java網(wǎng)上商城項目第1篇之用戶注冊模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • spring boot+mybatis搭建一個后端restfull服務的實例詳解

    spring boot+mybatis搭建一個后端restfull服務的實例詳解

    這篇文章主要介紹了spring boot+mybatis搭建一個后端restfull服務,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot實現(xiàn)單點登錄的實現(xiàn)詳解

    SpringBoot實現(xiàn)單點登錄的實現(xiàn)詳解

    在現(xiàn)代的Web應用程序中,單點登錄(Single?Sign-On)已經(jīng)變得越來越流行,在本文中,我們將使用Spring?Boot構建一個基本的單點登錄系統(tǒng),需要的可以參考一下
    2023-05-05

最新評論