如何在运行时停止执行特定的石英作业?

Bha*_*wat 7 java quartz-scheduler

我正在通过代码实现石英作业调度。下面是我安排和重新安排石英作业的方法。

void setJobSchedular(ScraperSearchOnRequest scraperSearchOnRequestInstance) {
        try {
            String groupName = "Scraper Group" + scraperSearchOnRequestInstance?.id
            String jobName = "ScraperOnRequestJob"
            Scheduler scheduler = getJobManagerService().quartzScheduler

            JobKey jobKey = new JobKey(jobName, groupName);
            //create JobDetail and Trigger
            JobDetail jobDetail = JobBuilder.newJob(com.dogmasystems.scraper.ScraperOnRequestJob1.class).withIdentity(jobKey).build();

            //add passing parameters to JobDataMap for first JobDetail
            jobDetail.getJobDataMap().put("id", scraperSearchOnRequestInstance?.id?.toString());
            jobDetail.getJobDataMap().put("groupName", groupName);

            if (scheduler.checkExists(jobKey)) {
                println("Rescheduling the old job having group name " + groupName)
                Trigger oldTrigger = scheduler.getTrigger(new TriggerKey(jobName, groupName))
                TriggerBuilder tb = oldTrigger.getTriggerBuilder();
                Trigger newTrigger = tb.startAt(scraperSearchOnRequestInstance.scheduledTime).usingJobData("id",
                        scraperSearchOnRequestInstance?.id?.toString()).build()
                scheduler.rescheduleJob(oldTrigger.key, newTrigger);
            } else {
                println("Scheduling the new job having group name " + groupName)
                SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName)
                        .startAt(scraperSearchOnRequestInstance.scheduledTime).usingJobData("id",
                        scraperSearchOnRequestInstance?.id?.toString()).build();
                scheduler.scheduleJob(jobDetail, trigger);
            }
        } catch (Exception e) {
            println("**********************Error in setJobSchedular for scraperOnRequestJob****************************")
            e.printStackTrace("Error while setting ScraperOnRequestJob " + e.printStackTrace())
            println("******************************************************")
        }
    }
Run Code Online (Sandbox Code Playgroud)

基本上我的工作在指定的时间运行,并且使用上述方法工作正常。

要求:

  1. 我想通过使用 ajax 调用单击UI 上的STOP按钮来停止我正在运行的作业执行。

在此处输入图片说明

为了停止工作,我给出了该特定工作的jobNamegroupName

void stopSchedularJob(String id) throws Exception {
        String groupName = "Scraper Group" + id
        String jobName = "ScraperOnRequestJob"
        JobKey jobKey = new JobKey(jobName, groupName);
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
        Scheduler scheduler = getJobManagerService().quartzScheduler
        Trigger trigger = scheduler.getTrigger(triggerKey)
        if (trigger) {
            println "Trigger key name to stop " + triggerKey.getName()
            // wait long enough to see the job execution
            Thread.sleep(10 * 1000); //1 minute
            scheduler.unscheduleJob(triggerKey)
            println "The ScraperOnRequestJob having " + groupName + " has been stopped."
        } else {
            println "No trigger could be found for " + triggerKey.getName()
        }

    }
Run Code Online (Sandbox Code Playgroud)

但它给了我错误:

Error |
2019-11-21 11:20:10,411 [http-bio-8078-exec-2] ERROR spi.SqlExceptionHelper  - ERROR: canceling statement due to user request
  Where: while updating tuple (0,36) in relation "scraper_search"
Error |
org.springframework.dao.DataAccessResourceFailureException: Hibernate operation: could not execute statement; SQL [n/a]; ERROR: canceling statement due to user request
  Where: while updating tuple (0,36) in relation "scraper_search"; nested exception is org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
  Where: while updating tuple (0,36) in relation "scraper_search"
Run Code Online (Sandbox Code Playgroud)

我尝试了很多解决方案,例如

  1. scheduler.interrupt(jobKey)

  2. scheduler.shutdown() (我只想杀死特定的工作,而不是所有的工作)

  3. Quartz 工作监听器

但我仍然无法找到特定的解决方案。

Yas*_*ash -1

您还可以使用计时器任务来安排任务。这样您就可以轻松地创建和终止它们。

publicabstractclassTimerTaskextendsObjectimplementsRunnable * 一种任务,可以通过定时器安排一次性或重复执行。

根据您的要求,用于Hashtable存储带有密钥的计时器对象以供将来使用。

public class TimerTasks {
    public static void main(String[] args) throws SchedulerException, IOException {

        Timer timerObj = new Timer();
        MyTask myTask = new MyTask(); // This task is scheduled to run every 10 seconds

        startTimer("T1", timerObj, myTask, 2, 10000);

            System.out.println("Enter Something to stop Timer.");
            System.in.read();
            System.in.read();

        terminateTimer("T1");

        System.out.println("Main end.");
    }

    static Map<String, Timer> taskGroup = new Hashtable<String, Timer>();
    public static String startTimer(String key, Timer timerObj, TimerTask task, long delay, long period) {
        if (taskGroup.containsKey(key)) {
            return "Fialure, On this key alreay timer is available.";
        } else {
            timerObj.scheduleAtFixedRate(task, delay, period);
            // You can save multiple, from key get timer object and you can cancel.
            taskGroup.put(key, timerObj);
            return "Success";
        }

    }
    public static void terminateTimer(String key) {
        if (taskGroup.containsKey(key)) {
            Timer timer = taskGroup.get("T1");
            // This task has been cancelled (with a call to TimerTask.cancel).
            timer.cancel();
            taskGroup.remove(key);
        }
    }
}

class MyTask extends TimerTask{
    public MyTask(){
        //Some stuffs
    }
    @Override
    public void run() {
        System.out.println("Hi, see its Timer task.");
    }
}
Run Code Online (Sandbox Code Playgroud)