五. Quartz 持久化的扩展
将 JobDetail,Trigger 存储到数据库里面,就可以完成持久化, 在项目运行的过程中,如果将合法的数据,
插入到对应的数据库表里面,是否就可以创建任务呢, 作一个任务管理系统的模块呢? 是可以的。
Quartz 支持动态的添加任务。
五.一 编写动态任务 MyJob2
package com.yjl.job; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class MyJob2 extends QuartzJobBean implements Serializable{ private static final long serialVersionUID = 1L; @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("动态任务,备份数据库的时间是:"+dateString); } }
类完整路径为: com.yjl.job.MyJob2
五.二 构建JobAndTrigge 的实体Bean JobAndTrigger
创建一个 JobAndTrigger的Bean, 里面封装一些 Job和Trigger的对象信息, 这些对象信息是前端传递过来的。
package com.yjl.trigger; import java.io.Serializable; /** * * @author 两个蝴蝶飞 * *用于接收 配置任务和触发器的信息 */ public class JobAndTrigger implements Serializable{ private static final long serialVersionUID = 1L; /** * @param jobName 任务名称 * @param jobGroupName 任务组的名称 * @param jobClassName 任务的名称 * @param triggerName 触发器名称 * @param triggerGroupName 触发器组名称 * @param cronExpression cron表达式 * @param repeatInterval 间隔 * @param repeatCount 次数 * @param startDelay 延迟开始时间 */ private String jobName; private String jobGroupName; private String jobClassName; private String triggerName; private String triggerGroupName; private String cronExpression; private Long repeatInterval; private Integer repeatCount; private Long startDelay; public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public String getJobGroupName() { return jobGroupName; } public void setJobGroupName(String jobGroupName) { this.jobGroupName = jobGroupName; } public String getJobClassName() { return jobClassName; } public void setJobClassName(String jobClassName) { this.jobClassName = jobClassName; } public String getTriggerName() { return triggerName; } public void setTriggerName(String triggerName) { this.triggerName = triggerName; } public String getTriggerGroupName() { return triggerGroupName; } public void setTriggerGroupName(String triggerGroupName) { this.triggerGroupName = triggerGroupName; } public String getCronExpression() { return cronExpression; } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public Long getRepeatInterval() { return repeatInterval; } public void setRepeatInterval(Long repeatInterval) { this.repeatInterval = repeatInterval; } public Integer getRepeatCount() { return repeatCount; } public void setRepeatCount(Integer repeatCount) { this.repeatCount = repeatCount; } public Long getStartDelay() { return startDelay; } public void setStartDelay(Long startDelay) { this.startDelay = startDelay; } @Override public String toString() { return "JobAndTrigger [jobName=" + jobName + ", jobGroupName=" + jobGroupName + ", jobClassName=" + jobClassName + ", triggerName=" + triggerName + ", triggerGroupName=" + triggerGroupName + ", cronExpression=" + cronExpression + ", repeatInterval=" + repeatInterval + ", repeatCount=" + repeatCount + ", startDelay=" + startDelay + "]"; } }
五.三 编写 Action QuartzAction
/** * * @author 两个蝴蝶飞 * * 任务管理的控制器 * */ @Controller @RequestMapping("/Quartz") public class QuartzAction { //Scheduler 是注入的 @Autowired private Scheduler scheduler; //查看列表 @RequestMapping("/list") @ResponseBody public Map<String,Object> list(){ Map<String,Object> map=new HashMap<String,Object>(); map.put("data",null); return map; } //只演示一下添加操作 @RequestMapping("/add") @ResponseBody public Map<String,Object> add(JobAndTrigger jobAndTrigger) throws Exception{ Map<String,Object> map=new HashMap<String,Object>(); //创建JobDetail JobDetail jobDetail=JobBuilder .newJob((Class<? extends Job>) Class.forName(jobAndTrigger.getJobClassName())) .withIdentity(jobAndTrigger.getJobName(),jobAndTrigger.getJobGroupName()) .storeDurably(true) .build(); //创建Trigger Trigger trigger=TriggerBuilder.newTrigger() .withIdentity(jobAndTrigger.getTriggerName(),jobAndTrigger.getTriggerGroupName()) .withSchedule(CronScheduleBuilder.cronSchedule(jobAndTrigger.getCronExpression())) .build(); //关联起来 scheduler.scheduleJob(jobDetail, trigger); map.put("response_status",true); return map; } }
五.四 applicationContext-job.xml 配置
与 四.三 移除后的配置一致, 不重复复制了。
五.五 编写前端页面 index.jsp
直接放置到 index.jsp 页面里面了, 引入 bootstrap 来美化样式。
构建一个简单的 Cron 触发器。
<body> <div class="col-sm-6 col-sm-offset-3"> <div class="col-sm-offset-2" style="color:#D33;margin-top:30px;"> <h2>两个蝴蝶飞 定时任务添加</h2> </div> <div style="margin-top:40px;"> <form action="${pageContext.request.contextPath}/Quartz/add" method="post" class="form-horizontal" role="form"> <div class="form-group"> <label class="col-md-2 control-label">任务名称:</label> <div class="col-md-4"> <input type="text" class="form-control" name="jobName" value=""/> </div> </div> <div class="form-group"> <label class="col-md-2 control-label">任务组名称:</label> <div class="col-md-4"> <input type="text" class="form-control" name="jobGroupName" value=""/> </div> </div> <div class="form-group"> <label class="col-md-2 control-label">任务类路径:</label> <div class="col-md-4"> <input type="text" class="form-control" name="jobClassName" value=""/> </div> </div> <div class="form-group"> <label class="col-md-2 control-label">触发器名称:</label> <div class="col-md-4"> <input type="text" class="form-control" name="triggerName" value=""/> </div> </div> <div class="form-group"> <label class="col-md-2 control-label">触发器组名称:</label> <div class="col-md-4"> <input type="text" class="form-control" name="triggerGroupName" value=""/> </div> </div> <div class="form-group"> <label class="col-md-2 control-label">cron表达式:</label> <div class="col-md-4"> <input type="text" class="form-control" name="cronExpression" value=""/> </div> </div> <div class="form-group"> <div class="col-sm-offset-3"> <input type="submit" value="添加任务" class="btn btn-success"/> </div> </div> </form> </div> </div> </body>
五.六 重启服务器验证
输入网址: http://localhost:8080/Quartz_Persistence
填写相应的信息:
在点击之前,看一下控制台的任务执行:
全部都是 Spring 的。
点击 添加任务按钮,
查看一下控制台:
页面跳转
数据库信息 qrtz_cron_triggers 内容查看
关闭服务器后,重新开启
可以动态地进行添加任务,当然,也可以进行移除任务,挂起任务,修改任务的触发cron表达等。
老蝴蝶这儿就不做过多的讲解了。