Java-Java Quartz使用学习笔记
主要内容: 包括两部分:第一部分:Java Quartz的基本介绍及基础知识、Cron表达式的介绍;第二部分:以一个Quartz封装工具类为例,重要介绍了Quartz API的使用;
第一部分
The Quartz JAR Files
The Quartz package includes a number of jar files, located in root directory of the distribution. The main Quartz library is named quartz-all-xxx.jar (where xxx is a version number). In order to use any of Quartz’s features, this jar must be located on your application’s classpath.
The Properties File
Quartz uses a properties file called (kudos on the originality) quartz.properties. This isn’t necessary at first, but to use anything but the most basic configuration it must be located on your classpath.
using Quartz
Here’s a quick snippet of code, that instantiates and starts a scheduler, and schedules a job for execution:
1.create a Job class
2.Instantiate a scheduler
3.Instantiate a job and a trigger
4. Translate any state argument with JobDataMap
The JobDataMap can be used to hold any amount of (serializable) data objects which you wish to have made available to the job instance when it executes. JobDataMap is an implementation of the Java Map interface, and has some added convenience methods for storing and retrieving data of primitive types.
5.Tell scheldule to tie some job with some trigger
6.start up a scheldule
7.shutdown a scheldule
注:只有quartz 1.8以下的版本才支持对spring的集成
在项目中使用quartz完成定时任务
1.加入依赖 在
<quartz.version>2.1.5</quartz.version>
在
2.定义版本发布的定时任务类
3.注入调度器
4.在VersionService中使用quartz schedule实现定时发布任务 1.定义SchedulerFactory
2.定义一个全局的JobList
3.在生成版本的方法中添加任务
4.添加一个job
5.删除一个job
6.关闭调度器
7.删除版本时,同时删除对应的job
Cron Expressions
Cron-Expressions are used to configure instances of CronTrigger. Cron-Expressions are strings that are actually made up of seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent: 1.Seconds 2.Minutes 3.Hours 4.Day-of-Month 5.Month 6.Day-of-Week 7.Year (optional field)
An example of a complete cron-expression is the string “0 0 12 ? * WED” - which means “every Wednesday at 12:00:00 pm”.
Individual sub-expressions can contain ranges and/or lists. For example, the day of week field in the previous (which reads “WED”) example could be replaced with “MON-FRI”, “MON,WED,FRI”, or even “MON-WED,SAT”.
Wild-cards (the ‘’ character) can be used to say “every” possible value of this field. Therefore the ‘’ character in the “Month” field of the previous example simply means “every month”. A ‘*’ in the Day-Of-Week field would therefore obviously mean “every day of the week”.
All of the fields have a set of valid values that can be specified. These values should be fairly obvious - such as the numbers 0 to 59 for seconds and minutes, and the values 0 to 23 for hours. Day-of-Month can be any value 1-31, but you need to be careful about how many days are in a given month! Months can be specified as values between 0 and 11, or by using the strings JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week can be specified as values between 1 and 7 (1 = Sunday) or by using the strings SUN, MON, TUE, WED, THU, FRI and SAT.
The ‘/’ character can be used to specify increments to values. For example, if you put ‘0/15’ in the Minutes field, it means ‘every 15th minute of the hour, starting at minute zero’. If you used ‘3/20’ in the Minutes field, it would mean ‘every 20th minute of the hour, starting at minute three’ - or in other words it is the same as specifying ‘3,23,43’ in the Minutes field. Note the subtlety that “/35” does *not mean “every 35 minutes” - it mean “every 35th minute of the hour, starting at minute zero” - or in other words the same as specifying ‘0,35’.
The ‘?’ character is allowed for the day-of-month and day-of-week fields. It is used to specify “no specific value”. This is useful when you need to specify something in one of the two fields, but not the other. See the examples below (and CronTrigger JavaDoc) for clarification.
The ‘L’ character is allowed for the day-of-month and day-of-week fields. This character is short-hand for “last”, but it has different meaning in each of the two fields. For example, the value “L” in the day-of-month field means “the last day of the month” - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means “7” or “SAT”. But if used in the day-of-week field after another value, it means “the last xxx day of the month” - for example “6L” or “FRIL” both mean “the last friday of the month”. You can also specify an offset from the last day of the month, such as “L-3” which would mean the third-to-last day of the calendar month. When using the ‘L’ option, it is important not to specify lists, or ranges of values, as you’ll get confusing/unexpected results.
The ‘W’ is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify “15W” as the value for the day-of-month field, the meaning is: “the nearest weekday to the 15th of the month”.
The ‘#’ is used to specify “the nth” XXX weekday of the month. For example, the value of “6#3” or “FRI#3” in the day-of-week field means “the third Friday of the month”.
Here are a few more examples of expressions and their meanings - you can find even more in the JavaDoc for org.quartz.CronExpression.
Example Cron Expressions
CronTrigger Example 1 - an expression to create a trigger that simply fires every 5 minutes
"0 0/5 * * * ?"
CronTrigger Example 2 - an expression to create a trigger that fires every 5 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:05:10 am, etc.).
"10 0/5 * * * ?"
CronTrigger Example 3 - an expression to create a trigger that fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday.
"0 30 10-13 ? * WED,FRI"
CronTrigger Example 4 - an expression to create a trigger that fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month. Note that the trigger will NOT fire at 10:00 am, just at 8:00, 8:30,
9:00 and 9:30
"0 0/30 8-9 5,20 * ?"
Note that some scheduling requirements are too complicated to express with a single trigger - such as “every 5 minutes between 9:00 am and 10:00 am, and every 20 minutes between 1:00 pm and 10:00 pm”. The solution in this scenario is to simply create two triggers, and register both of them to run the same job.
参考:
quartz-2.0.2学习小记:http://blog.csdn.net/cuihaiyang/article/details/6742869
Task Execution and Scheduling:http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/scheduling.html
第二部分
1.定义任务执行者
2.构造任务、调度任务
/**
* job service implements
* User: luowei
* Date: 12-7-8
* Time: 下午12:58
*/
@Service("jobService")
public class JobServiceImpl implements JobService {
@Autowired
NewestMusicService newestMusicService;
@Autowired
HotestMusicService hotestMusicService;
//最新任务的名称
private static String getNewestJobDetailName = null;
//最新触发器的名称
private static String getNewestTriggerName = null;
//最新任务组
private static String getNewestGroup = "getNewestGroup";
/**
* 获取最新的任务
*
* @return 加载任务的时间
*/
public Date getNewestJob() {
//调度时间
Date schelderDate = null;
//任务
JobDetail job = null;
String jobName = DateUtil.getYYYYMMDDHHMMSS(Calendar.getInstance().getTime()) + "_getNewestJob";
if (getNewestJobDetailName == null) {
job = JobUtil.initDurableJob(getNewestGroup, jobName, NewestJob.class);
}
Map<String, Object> map = new HashMap<String, Object>();
map.put(NewestJob.SERVICE, newestMusicService);
JobUtil.setData2Job(job, map);
//触发器
Trigger trigger = null;
String triName = DateUtil.getYYYYMMDDHHMMSS(Calendar.getInstance().getTime()) + "_getNewestTrigger";
Date startTime = DateUtils.parseDate(ConfigUtil.getConfigMap().get(FinalConfig.GET_NEWEST_STARTTIME).getValue());
Integer intervalInHours = Integer.valueOf(ConfigUtil.getConfigMap().get(FinalConfig.NEWEST_INTERVALINHOURS).getValue());
if (startTime != null && intervalInHours != null) {
trigger = JobUtil.initMinuteRepeatTrigger(getNewestGroup, triName, startTime, intervalInHours);
}
//调度任务
if (getNewestTriggerName == null) {
schelderDate = JobUtil.runJob(job, trigger);
} else {
TriggerKey triggerKey = JobUtil.triggerKeyMap.get(getNewestTriggerName);
schelderDate = JobUtil.reSchedulerJob(triggerKey, trigger);
}
//给名称赋值
getNewestJobDetailName = jobName;
getNewestTriggerName = triName;
return schelderDate;
}
//......
}
3.封装类
package com.ttpod.musicSNS.util;
import org.apache.commons.lang.StringUtils;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
/**
* User: luowei
* Date: 12-7-9
* Time: 上午10:00
*/
public class JobUtil {
protected static Logger logger = (Logger) LoggerFactory.getLogger(JobUtil.class);
/**
* define a scheduler ,will be a sington instance
*/
private static Scheduler scheduler = null;
/**
* get the name with default name 'QuartzScheduler' scheduler
* @return
*/
public static Scheduler getScheduler(){
if(scheduler == null){
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
try {
scheduler = schedulerFactory.getScheduler();
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
}
return scheduler;
}
/**
* get the scheduler with named shcedulerName
* @param schedulerName
* @return
*/
public static Scheduler getScheduler(String schedulerName){
if(scheduler == null){
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
try {
scheduler = schedulerFactory.getScheduler(schedulerName);
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
}
return scheduler;
}
/**
* scheduler a job with specefied trigger
* @param job
* @param trigger
* @return
*/
public static Date schedulerAJobWithTrigger(JobDetail job,Trigger trigger){
Date date = null;
if(scheduler == null){
scheduler = getScheduler();
}
try {
if(!scheduler.checkExists(job.getKey())
&& !scheduler.checkExists(trigger.getKey())){
date = scheduler.scheduleJob(job,trigger);
}
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
return date;
}
/**
* Remove (delete) the <code>{@link org.quartz.Trigger}</code> with the
* given key, and store the new given one - which must be associated
* with the same job (the new trigger must have the job name & group specified)
* - however, the new trigger need not have the same name as the old trigger.
*
* @param triggerKey identity of the trigger to replace
* @param newTrigger
* The new <code>Trigger</code> to be stored.
*
* @return <code>null</code> if a <code>Trigger</code> with the given
* name & group was not found and removed from the store (and the
* new trigger is therefore not stored), otherwise
* the first fire time of the newly scheduled trigger is returned.
*/
public static Date reSchedulerJob(TriggerKey triggerKey,Trigger newTrigger){
Date date = null;
try {
if(triggerKey != null && newTrigger != null && scheduler.isStarted())
date = scheduler.rescheduleJob(triggerKey,newTrigger);
triggerKeyMap.remove(triggerKey.getName());
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
return date;
}
/**
* scheduler a job with specefied trigger in a specefied shceduler
* @param schedulerName
* @param job
* @param trigger
* @return
*/
public static Date schedulerAJobWithTrigger(String schedulerName,JobDetail job,Trigger trigger){
Date date = null;
if(scheduler == null){
scheduler = getScheduler(schedulerName);
}
try {
if(!scheduler.checkExists(job.getKey())
&& scheduler.checkExists(trigger.getKey())){
date = scheduler.scheduleJob(job,trigger);
}
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
return date;
}
/**
* start scheduler
* @return
*/
public static Boolean startScheduler(){
Boolean flag = false;
try {
if(scheduler == null){
scheduler = getScheduler();
}
if(!scheduler.isStarted()){
scheduler.start();
}
flag = true;
return flag;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
return flag;
}
}
/**
* shutdown scheduler
* @return
*/
public static Boolean shutdownScheduler(){
try {
if(scheduler != null && !scheduler.isShutdown()){
scheduler.shutdown();
}
return true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
return false;
}
}
/**
* trigger key list
*/
public static Map<String,TriggerKey> triggerKeyMap = new HashMap<String,TriggerKey>();
/**
* get a trigger which will repeat forever with in every other specified hours
* @param groupName group name
* @param triggerName trigger name
* @param startTime start time
* @param intervalInHours interval in minutes
* @return the updated SimpleScheduleBuilder
*/
public static Trigger initHourRepeatTrigger(String groupName,String triggerName,
Date startTime,Integer intervalInHours){
SimpleTrigger trigger = null;
if(StringUtils.isNotBlank(groupName) && StringUtils.isNotBlank(triggerName)
&& startTime!=null && intervalInHours!=null){
trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity(triggerName,groupName)
.withSchedule(SimpleScheduleBuilder.repeatHourlyForever(intervalInHours))
.build();
triggerKeyMap.put(triggerName, trigger.getKey());
}
return trigger;
}
/**
* get a trigger which will repeat forever with in every other specified minutes
* @param groupName group name
* @param triggerName trigger name
* @param startTime start time
* @param intervalInMinutes interval in minutes
* @return the updated SimpleScheduleBuilder
*/
public static Trigger initMinuteRepeatTrigger(String groupName,String triggerName,
Date startTime,Integer intervalInMinutes){
SimpleTrigger trigger = null;
if(StringUtils.isNotBlank(groupName) && StringUtils.isNotBlank(triggerName)
&& startTime!=null && intervalInMinutes!= null){
trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity(triggerName,groupName)
.startAt(startTime)
.withSchedule(SimpleScheduleBuilder.repeatMinutelyForever(intervalInMinutes))
.build();
triggerKeyMap.put(triggerName, trigger.getKey());
}
return trigger;
}
/**
* get a trigger which will repeat forever with every other specified seconds
* @param groupName group name
* @param triggerName trigger name
* @param startTime start time
* @param intervalInSeconds interval in seconds
* @return a SimpleTrigger
*/
public static Trigger initSecondRepeatTrigger(String groupName,String triggerName,
Date startTime,Integer intervalInSeconds){
SimpleTrigger trigger = null;
if(StringUtils.isNotBlank(groupName) && StringUtils.isNotBlank(triggerName)
&& startTime!=null && intervalInSeconds!=null){
trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity(triggerName,groupName)
.startAt(startTime)
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(intervalInSeconds))
.build();
}
triggerKeyMap.put(triggerName, trigger.getKey());
return trigger;
}
/**
* set to repeat the given number of times - 1 with an interval of the given number of seconds.
* Note: Total count = 1 (at start time) + repeat count
* @param groupName group name
* @param triggerName trigger name
* @param startTime start time
* @param count count
* @param seconds seconds
* @return a SimpleTrigger
*/
public static Trigger initRepeatCountTrigger(String groupName,String triggerName,
Date startTime,Integer count,Integer seconds){
SimpleTrigger trigger = null;
if(StringUtils.isNotBlank(groupName) && StringUtils.isNotBlank(triggerName)
&& startTime!=null && count!=null && seconds!=null){
trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity(triggerName,groupName)
.startAt(startTime)
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(count,seconds))
.build();
triggerKeyMap.put(triggerName, trigger.getKey());
}
return trigger;
}
/**
* Create a CronTrigger with the given cron-expression string - which
* is presumed to b e valid cron expression (and hence only a RuntimeException
* will be thrown if it is not).
* @param groupName
* @param triggerName
* @param startTime
* @param cronExpression
* @return a CronTrigger
*/
public static Trigger initCronTrigger(String groupName,String triggerName,
Date startTime,String cronExpression){
CronTrigger trigger = null;
if(StringUtils.isNotBlank(groupName) && StringUtils.isNotBlank(triggerName)
&& StringUtils.isNotBlank(cronExpression) && startTime!=null){
trigger = (CronTrigger)TriggerBuilder.newTrigger()
.withIdentity(triggerName,groupName)
.startAt(startTime)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
triggerKeyMap.put(triggerName, trigger.getKey());
}
return trigger;
}
public static Map<String,JobKey> jobKeyMap = new HashMap<String,JobKey>();
/**
* init a job with the specified jobName,groupName and clazz
*
* @param groupName
* @param jobName
* @param clazz
* @return
*/
public static JobDetail initJob(String groupName, String jobName, Class<? extends Job> clazz){
JobDetail job = null;
if(StringUtils.isNotBlank(jobName) && StringUtils.isNotBlank(groupName) && clazz!=null){
job = JobBuilder.newJob((Class<? extends Job>) clazz)
.withIdentity(jobName,groupName)
.build();
jobKeyMap.put(jobName, job.getKey());
}
return job;
}
/**
* init durable job
* @param groupName
* @param jobName
* @param clazz
* @return
*/
public static JobDetail initDurableJob(String groupName, String jobName, Class<? extends Job> clazz){
JobDetail job = null;
if(StringUtils.isNotBlank(jobName) && StringUtils.isNotBlank(groupName) && clazz!=null){
job = JobBuilder.newJob((Class<? extends Job>) clazz)
.withIdentity(jobName,groupName)
.storeDurably()
.build();
jobKeyMap.put(jobName, job.getKey());
}
return job;
}
/**
* add data to JobDetail,which data were stored in map
* @param jobDetail jobDetail
* @param map map
* @return
*/
public static Boolean setData2Job(JobDetail jobDetail,Map<? extends String,? extends Object> map){
if(jobDetail!=null && map!=null){
jobDetail.getJobDataMap().putAll(map);
return true;
}else{
return false;
}
}
/**
* add data to Trigger,which data were stored in map
* @param trigger trigger
* @param map map
* @return
*/
public static Boolean setData2Trigger(Trigger trigger,Map<? extends String,? extends Object> map) {
if(trigger!=null && map!=null){
trigger.getJobDataMap().putAll(map);
return true;
}else {
return false;
}
}
/**
* delete a job with specified jobName,this oporater will delete the job from Scheduler,
* and remove the Entry Element which key equals jobName from global varible jobkeyMap
* @param jobName
* @return
*/
public static Boolean delJob(String jobName){
Boolean flag = false;
if(StringUtils.isNotBlank(jobName)){
JobKey jobKey = jobKeyMap.get(jobName);
try {
scheduler.deleteJob(jobKey);
jobKeyMap.remove(jobName);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
}
return flag;
}
/**
* delete all jobs,this oporater will delete the job from Scheduler,
* and remove the Entry Element which key equals jobName from global varible jobkeyMap
* @return
*/
public static Boolean delAllJob(){
Boolean flag = false;
try {
List<JobKey> jobKeyList = new ArrayList<JobKey>();
jobKeyList.addAll(jobKeyMap.values());
scheduler.deleteJobs(jobKeyList);
jobKeyMap.clear();
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
return flag;
}
/**
* Resume (un-pause) the <code>{@link org.quartz.JobDetail}</code> with
* the given key.
*
* <p>
* If any of the <code>Job</code>'s<code>Trigger</code> s missed one
* or more fire-times, then the <code>Trigger</code>'s misfire
* instruction will be applied.
* </p>
* @param jobName
* @return
*/
public static Boolean pauseJob(String jobName){
Boolean flag = false;
if(StringUtils.isNotBlank(jobName)){
JobKey jobKey = jobKeyMap.get(jobName);
try {
scheduler.pauseJob(jobKey);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
}
return flag;
}
/**
* Resume (un-pause) the <code>{@link org.quartz.JobDetail}</code> with
* the given key.
*
* <p>
* If any of the <code>Job</code>'s<code>Trigger</code> s missed one
* or more fire-times, then the <code>Trigger</code>'s misfire
* instruction will be applied.
* </p>
*
* @param jobName jobName
* @return
*/
public static Boolean resumeJob(String jobName){
Boolean flag = false;
if(StringUtils.isNotBlank(jobName)){
JobKey jobKey = jobKeyMap.get(jobName);
try {
scheduler.resumeJob(jobKey);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
}
return flag;
}
/**
* Remove the indicated <code>{@link Trigger}</code> from the scheduler.
*
* <p>If the related job does not have any other triggers, and the job is
* not durable, then the job will also be deleted.</p>
*/
public static Boolean unscheduleJob(String triggerName){
Boolean flag = false;
if(StringUtils.isNotBlank(triggerName)){
TriggerKey triggerKey = triggerKeyMap.get(triggerName);
try {
scheduler.unscheduleJob(triggerKey);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
}
return flag;
}
/**
* Remove all of the indicated <code>{@link Trigger}</code>s from the scheduler.
*
* <p>If the related job does not have any other triggers, and the job is
* not durable, then the job will also be deleted.</p>
*
* <p>Note that while this bulk operation is likely more efficient than
* invoking <code>unscheduleJob(TriggerKey triggerKey)</code> several
* times, it may have the adverse affect of holding data locks for a
* single long duration of time (rather than lots of small durations
* of time).</p>
*/
public static Boolean unscheduleJobs(){
Boolean flag = false;
try {
List<TriggerKey> triggerKeyList = new ArrayList<TriggerKey>();
triggerKeyList.addAll(triggerKeyMap.values());
scheduler.unscheduleJobs(triggerKeyList);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
return flag;
}
/**
* delete a trigger with specified triggerName,this operate will delete the job from Scheduler,
* and remove the Entry Element which key equals jobName from global varible jobkeyMap
* @param triggerName
* @return
*/
public static Boolean pauseTrigger(String triggerName){
Boolean flag = false;
if(StringUtils.isNotBlank(triggerName)){
TriggerKey triggerKey = triggerKeyMap.get(triggerName);
try {
scheduler.pauseTrigger(triggerKey);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
}
return flag;
}
/**
* Resume (un-pause) the <code>{@link Trigger}</code> with the given
* key.
*
* <p>
* If the <code>Trigger</code> missed one or more fire-times, then the
* <code>Trigger</code>'s misfire instruction will be applied.
* </p>
* @param triggerName
* @return
*/
public static Boolean resumeTrigger(String triggerName){
Boolean flag = false;
if(StringUtils.isNotBlank(triggerName)){
TriggerKey triggerKey = triggerKeyMap.get(triggerName);
try {
scheduler.resumeTrigger(triggerKey);
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
}
return flag;
}
/**
* Pause all triggers - similar to calling <code>pauseTriggerGroup(group)</code>
* on every group, however, after using this method <code>resumeAll()</code>
* must be called to clear the scheduler's state of 'remembering' that all
* new triggers will be paused as they are added.
* @return
*/
public static Boolean pauseAll(){
Boolean flag = false;
try {
scheduler.pauseAll();
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
return flag;
}
/**
* Resume (un-pause) all triggers - similar to calling
* <code>resumeTriggerGroup(group)</code> on every group.
*
* <p>
* If any <code>Trigger</code> missed one or more fire-times, then the
* <code>Trigger</code>'s misfire instruction will be applied.
* </p>
* @return
*/
public static Boolean resumeAll(){
Boolean flag = false;
try {
scheduler.resumeAll();
flag = true;
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
flag = false;
}
return flag;
}
/**
* run a job with specified trigger
* @param job job
* @param trigger trigger
* @return
*/
public static Date runJob(JobDetail job,Trigger trigger){
Date date = null;
if(job!=null && trigger!=null){
startScheduler();
date = schedulerAJobWithTrigger(job,trigger);
}
return date;
}
// public static Trigger getTrigger(String getNewestTriggerName){}
}