spring Java 示例:使用 Quartz 进行动态作业调度
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17669445/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java Example: Dynamic Job Scheduling with Quartz
提问by Narendra Verma
I want to expose an user interface to define Quartz JOBs dynamically. Where user should have facility to define JOBs properties like JOB name, cron expression or time interval, specific java class for task etc.
我想公开一个用户界面来动态定义 Quartz JOB。用户应该有能力定义 JOB 属性,如 JOB 名称、cron 表达式或时间间隔、任务的特定 java 类等。
Is there any Open Source that facilitates this feature? Or, If I want to create my own module for dynamic Quartz Scheduler, what should be the way to do so?
是否有任何开源可以促进此功能?或者,如果我想为动态 Quartz Scheduler 创建自己的模块,应该怎么做?
采纳答案by Narendra Verma
Example code for Dynamic Quartz JOB Scheduling:
动态 Quartz JOB 调度的示例代码:
Maven Dependencies
Maven 依赖项
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
Application Context File (dynamic-jobs.xml)
应用程序上下文文件 (dynamic-jobs.xml)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">
<!-- The Task Bean-->
<bean id="myTask" class="com.xxx.example.dynamicjob.MyTask" />
<!-- The quartz scheduler configuration -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
</beans>
Java Class for Task
任务的 Java 类
package com.xxx.example.dynamicjob;
public class MyTask
{
public void performAction() {
System.out.println("Hey, you reached me...:)");
}
}
Java Class to Create Dynamic Job
用于创建动态作业的 Java 类
package com.xxx.example.dynamicjob;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
public class DynamicJobExample {
/**
* @param args
*/
public static void main(String[] args) {
ClassPathResource res = new ClassPathResource("dynamic-jobs.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
//get the quartzFactory bean
Scheduler scheduler = (Scheduler) factory.getBean("scheduler");
//get the task bean
MyTask myTask = (MyTask) factory.getBean("myTask");
try {
// create JOB
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
jobDetail.setTargetObject(myTask);
jobDetail.setTargetMethod("performAction");
jobDetail.setName("MyJobDetail");
jobDetail.setConcurrent(false);
jobDetail.afterPropertiesSet();
/* SimpleTriggerBean trigger = new SimpleTriggerBean();
trigger.setBeanName("MyTrigger");
trigger.setJobDetail((JobDetail) jobDetail.getObject());
trigger.setRepeatInterval(5000);
trigger.afterPropertiesSet();
*/
// create CRON Trigger
CronTriggerBean cronTrigger = new CronTriggerBean();
cronTrigger.setBeanName("CRON0001");
// Execute after each 5 second
String expression = "5 * * * * ?";
cronTrigger.setCronExpression(expression);
cronTrigger.afterPropertiesSet();
//scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.scheduleJob((JobDetail) jobDetail.getObject(), cronTrigger);
// Start Scheduler
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
回答by Munish Chandel
Spring 4 allows me to do this without any problem (Quartz 2.0) - spring-dispatcher-servlet.xml
Spring 4 允许我毫无问题地执行此操作(Quartz 2.0) - spring-dispatcher-servlet.xml
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:scheduler id="myScheduler" pool-size="10"/>
<task:executor id="myExecutor" pool-size="1"/>
Inject above created bean into Spring bean or Service Class
将上面创建的 bean 注入 Spring bean 或 Service Class
@Service
public class DynamicJobExample {
@Autowired
@Qualifier("myScheduler")
private TaskScheduler scheduler;
public void schedule() throws ParseException {
scheduler.schedule(new MyTask(), new CronTrigger("5 * * * * ?"));
}
}
MyTask Should be a Runnable Class
MyTask 应该是一个可运行的类
public class MyTask implements Runnable{
@Override
public void run() {
System.out.println("Hey, you reached me...:)");
}
}
Maven Dependencies are (pom.xml)
Maven 依赖项是 (pom.xml)
<spring.version>4.1.0.RELEASE</spring.version>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
回答by omcartagena
You can create the JobDetail and Trigger objects this way also:
您也可以通过这种方式创建 JobDetail 和 Trigger 对象:
JobDetail jobDetail;
String myJobClass = "com.MyJobClass";
String myJobName = "myJobName";
String myJobGroup ="myJobGroup";
Class myJobClassType= Class.forName(myJobClass);
jobDetail =JobBuilder.newJob().ofType(myJobClassType)
.withIdentity(myJobName, myJobGroup).build();
String myGroup = "myGroup";
String name = "TriggerName";
String expresion = "5 * * * * ?";
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity(name, myGroup)
.withSchedule(
CronScheduleBuilder.cronSchedule(expresion))
.build();
回答by zawhtut
package com.myproject;
import java.text.ParseException;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.stereotype.Component;
@Component
public class QuartzSchedulerExample {
public QuartzSchedulerExample() {
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler;
try {
scheduler = schedFact.getScheduler();
JobDetail details = JobBuilder.newJob(MyMailBean.class)
.withDescription("something")
.withIdentity("mejob","myGroup")
.storeDurably(true).build();
CronTriggerImpl trigger = new CronTriggerImpl();
trigger.setName("T1");
try {
trigger.setCronExpression("0 0 0 * * ? *");
} catch (ParseException e) {
e.printStackTrace();
}
trigger.setDescription("desc");
scheduler.scheduleJob(details,trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
The job will run every day 00:00:00 (hour:minute:second)
作业将在每天 00:00:00(时:分:秒)运行
回答by Atul
I have similar issue where I want to update the cron expression in JOB_DETAILS table of quartz(2.3.2version). The scenario is like, I have already a scheduled job running and I want to update it and run it on different frequency. Rest of the things I managed but the update on the table won't happen. So after reading the documentation I found out that you can update the details of the job using add method.
我有类似的问题,我想更新石英(2.3.2版本)的JOB_DETAILS 表中的 cron 表达式。这个场景就像,我已经有一个预定的作业在运行,我想更新它并以不同的频率运行它。我管理的其余事情,但表上的更新不会发生。因此,在阅读文档后,我发现您可以使用 add 方法更新作业的详细信息。
// store, and set overwrite flag to 'true'
scheduler.addJob(jobDetail, true);
The things I am doing with Java only.
我只用 Java 做的事情。

