spring quarartzはタイミングタスク、遅延タスクの動的増加、削除、修正、調査を実現します。
24152 ワード
前の2つのブログを参照してください。 RAM Job Store方式で構成されています。https://blog.csdn.net/llmys/article/details/81069445 Job StoreTX方式の恒久化はデータベースにあり、https://blog.csdn.net/llmys/article/details/81069638 まず私が必要とするquartzに関する情報は、ジョブ名、ジョブグループ名、ジョブ開始時間、ジョブ終了時間などを含み、これらの属性を保存するためにUniQuartzBenのクラスを定義します。
http://itindex.net/detail/53315-spring-quartz-%E7%AE%A1%E7%90%86
http://ifeve.com/quartz-5-simpletrigger/
import java.util.Date;
public class UniQuartzBean {
private String jobName; //
private String jobGroupName; //
private String oldJobName; //
private String oldJobGroupName; //
private String schedulerInstanceId; // ID
private String schedulerName; //
private String triggerName; //
private String triggerGroupName; //
private String jobClass; //
private String description; //
private Date startTime; //
private Date previousTime; //
private Date nextTime; //
private Date endTime; //
private int repeatCount; // ( )
private long repeatInterval; //
private int timesTriggered; //
private String cronExpression; // ( )
private String triggerState; //
private String jobId; // FireInstanceId ,
private Long jobRunTime; // , , -1
/**
*
None:Trigger , , , Trigger
NORMAL:
PAUSED:
COMPLETE: ,
BLOCKED:
ERROR:
*/
private String triggerType; //
private String timeZone; // timeZone
private boolean isConcurrent; //
public UniQuartzBean() {
super();
}
// 、
public UniQuartzBean(String jobName, String jobGroupName) {
super();
this.jobName = jobName;
this.jobGroupName = jobGroupName;
}
//
public UniQuartzBean(String jobName, String jobGroupName, String oldJobName, String oldJobGroupName) {
super();
this.jobName = jobName;
this.jobGroupName = jobGroupName;
this.oldJobName = oldJobName;
this.oldJobGroupName = oldJobGroupName;
}
...Set、Get
}
また、設定タスクを変更するには、タスクの時間間隔、タスクの回数、終了時間などを設定し、クラスを定義してこれらの属性を保存します。public class UniQuartzConfig {
/**
* ?
* , true; true
* , false;
* @return
*/
private boolean isTimedTask = true;
/**
* , ;
* :'0/5 * * * * ?'
* @return
*/
private String cron = "";
/**
* , delayTime ;
* delayTimeType;
* 0, ;
* @return
*/
private int delayTime = 0;
/**
* , ' ';
* IntervalUnit.MILLISECOND
* IntervalUnit.SECOND
* IntervalUnit.MINUTE
* IntervalUnit.HOUR
* IntervalUnit.DAY
* IntervalUnit.WEEK
* IntervalUnit.MONTH
* IntervalUnit.YEAR
* @return
*/
private IntervalUnit delayTimeType = IntervalUnit.SECOND;
/**
* “ ” , 1
* “ ” , “intervalTimeType”
* @return
*/
private int intervalTime = 1;
/**
* “ ” , ' ';
* IntervalUnit.MILLISECOND
* IntervalUnit.SECOND
* IntervalUnit.MINUTE
* IntervalUnit.HOUR
* @return
*/
private IntervalUnit intervalTimeType = IntervalUnit.SECOND;
/**
* “ ” , 1;
* “0” , ;
* “-1” , , endTime,endTimeType;
* @return
*/
private int repeatCount = 1;
/**
* , ;
* “endTimeType”
* @return
*/
private int endTime = 0;
/**
* , ;
* IntervalUnit.MILLISECOND
* IntervalUnit.SECOND
* IntervalUnit.MINUTE
* IntervalUnit.HOUR
* IntervalUnit.DAY
* IntervalUnit.WEEK
* IntervalUnit.MONTH
* IntervalUnit.YEAR
* @return
*/
private IntervalUnit endTimeType = IntervalUnit.SECOND;
public static UniQuartzConfig newInstance() {
return new UniQuartzConfig();
}
private UniQuartzConfig() {
super();
}
...Set、Get
}
次はservice類で、任務の添削を実現します。@Component
public class UniQuartzService implements UniQuartz {
@Autowired
private Scheduler quartzScheduler;
/**
*
* @param uqb
* 、
* @param uqc
*
* @param quartzClass
*
* @param parameter
*
* @return
*/
@Override
public boolean addJob(UniQuartzBean uqb, UniQuartzConfig uqc, Class extends Job> quartzClass, Object parameter) {
try {
//
boolean exist = isTriggerExist(uqb);
// ,
Trigger trigger = getTrigger(uqb, uqc);
if (exist) {
if (!ObjectUtils.isEmpty(parameter)) {
trigger.getJobDataMap().put("context", parameter); //
}
TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
quartzScheduler.rescheduleJob(triggerKey, trigger);
} else {
// JobDetail,
JobDetail jobDetail = getNewJob(uqb, quartzClass);
if (!ObjectUtils.isEmpty(parameter)) {
jobDetail.getJobDataMap().put("context", parameter);
}
//
quartzScheduler.scheduleJob(jobDetail, trigger);
//quartzScheduler.start();
}
System.out.println(JSON.toJSONString(uqc));
} catch (SchedulerException e) {
e.printStackTrace();
}
return true;
}
/**
*
*
* @param uqb
* @param uqc
* @return
*/
@Override
public boolean modifyJobTime(UniQuartzBean uqb, UniQuartzConfig uqc) {
try {
if (isTriggerExist(uqb) == false) {
System.err.println(" [JobName=" + uqb.getJobName() + ",JobGroupName=" + uqb.getJobGroupName());
return false;
} else {
addJob(uqb, uqc, null, null);
return true;
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
*
*
* @param jobName
* @param jobGroupName
* @param uqc
* @return
*/
@Override
public boolean modifyJobTime(String jobName, String jobGroupName, UniQuartzConfig uqc) {
UniQuartzBean uqb = new UniQuartzBean(jobName, jobGroupName);
return modifyJobTime(uqb, uqc);
}
/**
*
*/
@Override
public boolean pauseJob(UniQuartzBean uqb) {
return pauseJob(uqb.getJobName(), uqb.getJobGroupName());
}
/**
*
*/
@Override
public boolean pauseJob(String jobName, String jobGroupName) {
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
try {
//
quartzScheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
quartzScheduler.pauseJob(jobKey);
return true;
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
*
*/
@Override
public boolean pauseAllJob() {
try {
quartzScheduler.pauseAll();
} catch (SchedulerException e) {
e.printStackTrace();
}
return true;
}
/**
*
*/
@Override
public boolean resumeJob(UniQuartzBean uqb) {
return resumeJob(uqb.getJobName(), uqb.getJobGroupName());
}
/**
*
*/
@Override
public boolean resumeJob(String jobName, String jobGroupName) {
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
try {
//
quartzScheduler.resumeTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
quartzScheduler.resumeJob(jobKey);
return true;
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
*
*/
@Override
public void resumeAllJob() {
try {
quartzScheduler.resumeAll();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
*
*/
@Override
public boolean deleteJob(UniQuartzBean uqb) {
return deleteJob(uqb.getJobName(), uqb.getJobGroupName());
}
/**
*
*/
@Override
public boolean deleteJob(String jobName, String jobGroupName) {
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
try {
//
quartzScheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
//
quartzScheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
//
quartzScheduler.deleteJob(jobKey);
return true;
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
* , 。 (false)。 。
*/
@Override
public void shutdown() {
try {
quartzScheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
*
*
* @param uqb
* @param trigName
* @param trigGroupName
* @return
* @throws SchedulerException
*/
private boolean isTriggerExist(UniQuartzBean uqb) throws SchedulerException {
boolean bExist = false;
TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
Trigger trigger = quartzScheduler.getTrigger(triggerKey);
if (!ObjectUtils.isEmpty(trigger)) {
bExist = true;
}
return bExist;
}
/**
* , ; , ;
*
* @param uqb
* @param uqc
* @return
* @throws SchedulerException
*/
private Trigger getTrigger(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
return uqc.isTimedTask() ? configCronTrigger(uqb, uqc) : configSimpleTrigger(uqb, uqc);
}
/**
* -
*
* @param uqb
* @param uqc
* @return
* @throws SchedulerException
*/
private Trigger configCronTrigger(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
Trigger trigger = null;
ScheduleBuilder> scheduleBuilder = getScheduleBuilder(uqc);
if (isTriggerExist(uqb)) { //
System.out.println(" - --- ");
TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
trigger = quartzScheduler.getTrigger(triggerKey);
trigger = ((CronTrigger) trigger).getTriggerBuilder().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
.withSchedule((CronScheduleBuilder) scheduleBuilder).withDescription(uqb.getDescription()).build();
} else { //
System.out.println(" - --- ");
trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
.withSchedule(scheduleBuilder).withDescription(uqb.getDescription()).build();
}
return trigger;
}
/**
*
*
* @param uqa
* @return
*/
private ScheduleBuilder> getScheduleBuilder(UniQuartzConfig uqc) {
ScheduleBuilder> scheduleBuilder = null;
if (uqc.isTimedTask()) { //
scheduleBuilder = CronScheduleBuilder.cronSchedule(uqc.getCron());
} else { // 、
scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
}
return scheduleBuilder;
}
/**
* 、 、 、 、 、 、 、
*
* @param uqb
* @param uqc
* @return
* @throws SchedulerException
*/
private Trigger configSimpleTrigger(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
System.out.println(" Simple . " + uqc.getRepeatCount());
if (uqc.getRepeatCount() == -1) { // ,
System.out.println(" - ");
return configSimpleTriggerEnd(uqb, uqc);
} else if (uqc.getRepeatCount() == 0) { //
System.out.println(" - ....");
return configSimpleTriggerForever(uqb, uqc);
} else { //
System.out.println(" - ...");
return configSimpleTriggerCount(uqb, uqc);
}
}
/**
*
*
* @param trigName
* @param trigGroupName
* @param uqa
* @return
* @throws SchedulerException
*/
private Trigger configSimpleTriggerEnd(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
Trigger trigger = null;
TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
SimpleScheduleBuilder scheduleBuilder = (SimpleScheduleBuilder) getScheduleBuilder(uqc);
//
Date startDate = DateBuilder.futureDate(uqc.getDelayTime(), uqc.getDelayTimeType());
//
Date endDate = DateBuilder.futureDate(uqc.getEndTime(), uqc.getEndTimeType());
//
scheduleBuilder = configSimpleTriggerInterval(scheduleBuilder, uqc);
scheduleBuilder = scheduleBuilder.repeatForever();
if (isTriggerExist(uqb)) {
trigger = quartzScheduler.getTrigger(triggerKey);
trigger = ((SimpleTrigger) trigger).getTriggerBuilder()
.withIdentity(uqb.getJobName(), uqb.getJobGroupName()).withSchedule(scheduleBuilder)
.withDescription(uqb.getDescription()).startAt(startDate).endAt(endDate).build();
System.out.println(" - - --- ");
} else {
System.out.println(" - - --- ");
//
trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
.withDescription(uqb.getDescription()).withSchedule(scheduleBuilder).startAt(startDate)
.endAt(endDate).build();
}
return trigger;
}
/**
* 、
*
* @param scheduleBuilder
* @param uqa
*/
private SimpleScheduleBuilder configSimpleTriggerInterval(SimpleScheduleBuilder scheduleBuilder,
UniQuartzConfig uqc) {
SimpleScheduleBuilder res = scheduleBuilder;
if (uqc.getIntervalTime() > 0) { // 0
System.out.println(" 0");
switch (uqc.getIntervalTimeType()) {
case MILLISECOND:
System.out.println(" :" + uqc.getIntervalTime());
res = scheduleBuilder.withIntervalInMilliseconds(uqc.getIntervalTime());
break;
case SECOND:
System.out.println(" :" + uqc.getIntervalTime());
res = scheduleBuilder.withIntervalInSeconds(uqc.getIntervalTime());
break;
case MINUTE:
System.out.println(" :" + uqc.getIntervalTime());
res = scheduleBuilder.withIntervalInMinutes(uqc.getIntervalTime());
break;
case HOUR:
System.out.println(" :" + uqc.getIntervalTime());
res = scheduleBuilder.withIntervalInHours(uqc.getIntervalTime());
break;
default:
System.err.println(" :" + uqc.getIntervalTimeType());
break;
}
} else {
System.err.println(" 0.");
}
return res;
}
/**
*
*
* @param uqb
* @param uqc
* @return
* @throws SchedulerException
*/
private Trigger configSimpleTriggerForever(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
Trigger trigger = null;
TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
SimpleScheduleBuilder scheduleBuilder = (SimpleScheduleBuilder) getScheduleBuilder(uqc);
//
Date startDate = DateBuilder.futureDate(uqc.getDelayTime(), uqc.getDelayTimeType());
//
scheduleBuilder = configSimpleTriggerInterval(scheduleBuilder, uqc);
scheduleBuilder = scheduleBuilder.repeatForever();//
if (isTriggerExist(uqb)) {
trigger = quartzScheduler.getTrigger(triggerKey);
trigger = ((SimpleTrigger) trigger).getTriggerBuilder()
.withIdentity(uqb.getJobName(), uqb.getJobGroupName()).withSchedule(scheduleBuilder)
.withDescription(uqb.getDescription()).startAt(startDate).build();
System.out.println(" - - --- ");
} else {
System.out.println(" - - --- ");
//
trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
.withDescription(uqb.getDescription()).withSchedule(scheduleBuilder).startAt(startDate).build();
}
return trigger;
}
/**
*
*
* @param uqb
* @param uqc
* @return
* @throws SchedulerException
*/
private Trigger configSimpleTriggerCount(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
Trigger trigger = null;
TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
SimpleScheduleBuilder scheduleBuilder = (SimpleScheduleBuilder) getScheduleBuilder(uqc);
//
Date startDate = DateBuilder.futureDate(uqc.getDelayTime(), uqc.getDelayTimeType());
//
scheduleBuilder = configSimpleTriggerInterval(scheduleBuilder, uqc);
scheduleBuilder = scheduleBuilder.withRepeatCount(uqc.getRepeatCount() - 1); //
if (isTriggerExist(uqb)) {
System.out.println(" ---------------------2:" + " ");
trigger = quartzScheduler.getTrigger(triggerKey);
trigger = ((SimpleTrigger) trigger).getTriggerBuilder()
.withIdentity(uqb.getJobName(), uqb.getJobGroupName()).withSchedule(scheduleBuilder)
.withDescription(uqb.getDescription()).startAt(startDate).build();
} else {
System.out.println(" ---------------------2:" + " ");
//
trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
.withDescription(uqb.getDescription()).withSchedule(scheduleBuilder).startAt(startDate).build();
}
return trigger;
}
/**
*
*
* @param uniSchTrig
* @param quartzClass
* @return
*/
private JobDetail getNewJob(UniQuartzBean uqb, Class extends Job> quartzClass) {
JobDetail jobDetail = JobBuilder.newJob(quartzClass).withIdentity(uqb.getJobName(), uqb.getJobGroupName())
.build();
return jobDetail;
}
private UniQuartzBean getJob(JobKey jobKey, Trigger trigger) {
UniQuartzBean uniQuartzBean = null;
try {
String jobName = jobKey.getName();
String jobGroupName = jobKey.getGroup();
// Trigger trigger = quartzScheduler.getTrigger(triggerKey);
if (!ObjectUtils.isEmpty(trigger)) {
uniQuartzBean = new UniQuartzBean();
// , 、 、 、
uniQuartzBean.setJobName(jobName).setJobGroupName(jobGroupName).setTriggerName(jobName)
.setTriggerGroupName(jobGroupName);
// , ID、 、 、 、
uniQuartzBean.setSchedulerInstanceId(quartzScheduler.getSchedulerInstanceId())
.setSchedulerName(quartzScheduler.getSchedulerName());
JobDetail jobDetail = quartzScheduler.getJobDetail(jobKey);
uniQuartzBean.setJobClass("" + jobDetail.getJobClass()).setDescription(trigger.getDescription())
.setTriggerState(quartzScheduler.getTriggerState(trigger.getKey()).name());
//
uniQuartzBean.setStartTime(trigger.getStartTime()).setPreviousTime(trigger.getPreviousFireTime())
.setNextTime(trigger.getNextFireTime()).setEndTime(trigger.getEndTime());
//
uniQuartzBean.setConcurrent(jobDetail.isConcurrentExectionDisallowed());
// 、 、 、
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
uniQuartzBean.setTriggerType("CronTrigger");
uniQuartzBean.setCronExpression(cronTrigger.getCronExpression())
.setTimeZone(cronTrigger.getTimeZone().getID());
} else if (trigger instanceof SimpleTrigger) {
SimpleTrigger simpleTrigger = (SimpleTrigger) trigger;
uniQuartzBean.setTriggerType("SimpleTrigger");
uniQuartzBean.setRepeatCount(simpleTrigger.getRepeatCount() + 1)
.setRepeatInterval(simpleTrigger.getRepeatInterval())
.setTimesTriggered(simpleTrigger.getTimesTriggered());
}
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return uniQuartzBean;
}
/**
*
* @param uqb
* @return
*/
@Override
public UniQuartzBean getJob(UniQuartzBean uqb) {
return getJob(uqb.getJobName(), uqb.getJobGroupName());
}
/**
*
* @param jobName
* @param jobGroupName
* @return
*/
@Override
public UniQuartzBean getJob(String jobName, String jobGroupName) {
UniQuartzBean uniQuartzBean = null;
try {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
Trigger trigger = quartzScheduler.getTrigger(triggerKey);
if (!ObjectUtils.isEmpty(trigger)) {
JobKey jobKey = trigger.getJobKey();
uniQuartzBean = getJob(jobKey, trigger);
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return uniQuartzBean;
}
/**
* , quartz
* @return
*/
@Override
public List getAllJob() {
List listUniQuartzBean = new ArrayList<>();
try {
GroupMatcher matcher = GroupMatcher.anyJobGroup();
Set jobKeys = quartzScheduler.getJobKeys(matcher);
if (!CollectionUtils.isEmpty(jobKeys)) {
jobKeys.forEach(jobKey -> {
try {
List extends Trigger> listTrigger = quartzScheduler.getTriggersOfJob(jobKey);
if (!CollectionUtils.isEmpty(listTrigger)) {
listTrigger.forEach(trigger->{
UniQuartzBean uniQuartzBean = getJob(jobKey, trigger);
if (!ObjectUtils.isEmpty(uniQuartzBean)) {
listUniQuartzBean.add(uniQuartzBean);
}
});
}
} catch (SchedulerException e) {
e.printStackTrace();
}
});
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return listUniQuartzBean;
}
/**
* -
*
* @return
*/
@Override
public List getAllJobInstance() {
List listUniQuartzBean = new ArrayList<>();
try {
List listExecJob = quartzScheduler.getCurrentlyExecutingJobs();
if (!CollectionUtils.isEmpty(listExecJob)) {
listExecJob.forEach(execJob->{
JobKey jobKey = execJob.getJobDetail().getKey();
try {
List extends Trigger> listTrigger = quartzScheduler.getTriggersOfJob(jobKey);
if (!CollectionUtils.isEmpty(listTrigger)) {
listTrigger.forEach(trigger->{
//UniQuartzBean uniQuartzBean = getJob(jobKey, trigger);
UniQuartzBean uniQuartzBean = getRuningJob(execJob, trigger);
if (!ObjectUtils.isEmpty(uniQuartzBean)) {
listUniQuartzBean.add(uniQuartzBean);
}
});
}
} catch (SchedulerException e) {
e.printStackTrace();
}
});
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return listUniQuartzBean;
}
/**
*
* @param execJob
* @param trigger
* @return
*/
private UniQuartzBean getRuningJob(JobExecutionContext execJob, Trigger trigger) {
UniQuartzBean uniQuartzBean = null;
try {
JobKey jobKey = trigger.getJobKey();
String jobName = jobKey.getName();
String jobGroupName = jobKey.getGroup();
if (!ObjectUtils.isEmpty(trigger)) {
uniQuartzBean = new UniQuartzBean();
// , 、 、 、
uniQuartzBean.setJobName(jobName).setJobGroupName(jobGroupName).setTriggerName(jobName)
.setTriggerGroupName(jobGroupName);
JobDetail jobDetail = quartzScheduler.getJobDetail(jobKey);
// “ ” 、 、
uniQuartzBean.setStartTime(execJob.getFireTime()).setPreviousTime(execJob.getPreviousFireTime())
.setNextTime(execJob.getNextFireTime());
//
uniQuartzBean.setJobClass("" + jobDetail.getJobClass()).setDescription(trigger.getDescription());
// 、 ID
uniQuartzBean.setJobRunTime(execJob.getJobRunTime()).setJobId(execJob.getFireInstanceId());
}
} catch (SchedulerException e) {
e.printStackTrace();
}
return uniQuartzBean;
}
}
テスト:@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath*:/spring-context*.xml", "classpath*:/quartz_jobs.xml" })
public class UniQuartz2Test {
@Autowired
UniQuartz uniQuartz2;
@Test
public void testAddJob_TimedTask() throws InterruptedException {
System.out.println("-------- ------start---------");
UniQuartzConfig uqc =UniQuartzConfig.newInstance().setCron("0/3 * * * * ?");
UniQuartzBean uqb = new UniQuartzBean("jobName2", "jobGroupName1");
uniQuartz2.addJob(uqb, uqc, TimedTaskJob.class, " 3 .");
uqb.setDescription(" ");
System.out.println("-------- ------stop---------");
int i= 0;
while (true) {
i++;
Thread.sleep(1000);
if (i >= 16)
break;
}
}
}
ブログを参照してください:http://itindex.net/detail/53315-spring-quartz-%E7%AE%A1%E7%90%86
http://ifeve.com/quartz-5-simpletrigger/