java - 如何使用在运行时更改的动态 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 的情况下进行相同的调度。
请建议。
解决方案
推荐阅读
- python - 你能用 webbrowser 打开一个无头浏览器吗?
- regex - 如何找到与介词相关的名词
- node.js - 三个应用程序之间的 CORS 不一致
- javascript - Node.js + Express:尝试正确显示 GET 请求标头
- angular - Angular:更改路线时在组件中显示加载栏
- linux - Linux下的usb批量传输超时,而它在Windows下工作
- python - 在 Visual Studio Code 中运行 Anaconda python Hello World 的语法无效
- node.js - 在 node.js 服务器上联网 websocket
- java - 如何在 Spring 中读取外部属性文件?
- python - Pygame在简单游戏上的低帧率