首页 > 解决方案 > 如何使用在运行时更改的动态 Cron 作业在 Weblogic 中设计 Quartz 调度程序?

问题描述

我在独立的罐子里使用石英。在 Weblogic 12.2.1.3 的 SET ENV PRE_CLASSPATH 中添加。配置的启动类。Cron 参数是从 DB 表动态传递的。直到没事为止。但我想更改 db 表中的 cron 参数,以便 Quartz 采用它并在 RUNTIME 本身动态更改调度时间。问题是,我必须重新启动 weblogic 才能生效。因为 Quartz 只在服务器启动时检查 DB 参数。如何让它实时工作?


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 在不重新启动 weblogic 的情况下进行相同的调度。

请建议。

标签: javadynamiccronquartz-schedulerweblogic12c

解决方案


推荐阅读