Как спроектировать Quartz Scheduler в Weblogi c с заданием Dynami c Cron, которое изменяется во время выполнения? - PullRequest
1 голос
/ 15 января 2020

Я использую Кварц в отдельной банке. Добавлено, что в SET ENV PRE_CLASSPATH Weblogi c 12.2.1.3. Настроенный класс запуска. Параметр Cron динамически передается из таблицы БД. Пока это хорошо. Но я хочу изменить параметр cron в таблице db, чтобы Quartz взял его и динамически изменил расписание по расписанию. Проблема в том, что мне нужно перезапустить weblogi c, чтобы получить этот эффект. Потому что Quartz проверяет параметр БД только во время запуска сервера. Как заставить это работать в режиме реального времени?


package com.adac.scheduler.service;

import java.util.Date;

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

public class QuartzFTPPush implements Job{

public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("This is a Job That is Scheduled At "+new Date());
    }

}

package com.adac.scheduler.service;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;
import java.sql.*;


public class QuartzFTPPushCronTrigger {


    public static void main(String[] args) throws Exception {

        Class.forName("oracle.jdbc.driver.OracleDriver"); 
        Connection con=DriverManager.getConnection("jdbc:oracle:thin:AGPOS/yed6_4aN@10.6.6.11:1532:AGPTST");
        Statement stmt=con.createStatement();
        //ResultSet rs=stmt.executeQuery("SELECT DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_SID, DB_TABLE from AG_RSD_SCHEDULE_MAS_TBL");

        ResultSet rs = stmt.executeQuery("Select cron_schedule from AG_RSD_SCHEDULE_MAS_TBL where company_id=5");
        /*
         * while(rs.next())
         * System.out.println(rs.getInt(1)+"  "+rs.getString(2)+"  "+rs.getString(3));
         */  
        rs.next();
        String cron_schedule = rs.getString(1);
            con.close();  




        final JobKey jobKey = new JobKey("QuartzFTPPushName", "group1");
        final JobDetail job = JobBuilder.newJob(QuartzFTPPush.class).withIdentity(jobKey).build();

        //final String cron_schedule = "0/5 * * * * ?";
        //final Trigger trigger = TriggerBuilder.newTrigger().withIdentity("QuartzFTPPushTriggerName", "group1").withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

        final Trigger trigger = TriggerBuilder.newTrigger().withIdentity("QuartzFTPPushTriggerName", "group1").withSchedule(CronScheduleBuilder.cronSchedule(cron_schedule)).build();

        final Scheduler scheduler = new StdSchedulerFactory().getScheduler();

        // Listener attached to jobKey
        scheduler.getListenerManager().addJobListener(new QuartzFTPPushListener(), KeyMatcher.keyEquals(jobKey));

        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }

}

package com.adac.scheduler.service;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;


public class QuartzFTPPushListener implements JobListener {

    public String getName() {
        return "QuartzFTPPushListener";
    }

    public void jobToBeExecuted(JobExecutionContext context) {

        final String jobName = context.getJobDetail().getKey().toString();
        System.out.println("jobToBeExecuted: " + jobName + " is starting...");

    }

    public void jobExecutionVetoed(JobExecutionContext context) {
        System.out.println("jobExecutionVetoed");
    }

    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
        System.out.println("jobWasExecuted");

        final String jobName = context.getJobDetail().getKey().toString();
        System.out.println("Job : " + jobName + " is finished!!");

        if (!jobException.getMessage().equals("")) {
            System.out.println("Exception thrown by: " + jobName + " Exception: " + jobException.getMessage());
        }
    }


}

Select cron_schedule from "AG_RSD_SCHEDULE_MAS_TBL" where company_id=5;

Результат запроса выше 0/10 * * * *?. Я хочу изменить это на какое-то другое значение, скажем, 0/5 * * * *?. И хотите, чтобы Quartz планировал с тем же без перезапуска weblogi c.

Пожалуйста, предложите.

...