定时任务服务开发笔记(2)——开发Web端任务管理页面

时间:2022-11-03 22:28:28

其实这个任务今天很早的时候就已经完成了,可是由于暴雨宿舍竟然神奇地断了网,所以到现在才能整理发上来。

由于断网没有其他事情做,我将整个项目重新整理了一遍,利用MyEclipse的各种工具对项目增加了SSH框架支持,为后续开发铺平道路。

开发Web端管理页面,其实还是十分简单的。

因为增加了SSH支持,开发起来也就更加的简便了。

一、编写任务管理类ISDDataJobManagerService

在该类中,主要是提供了对任务的增删查改,需要实现的具体方法如下。

import java.util.List;


public interface ISDDataJobManager {
public List<SDDataJob> getJobList() throws Exception;
public List<SDDataJob> getExcutingJobList() throws Exception;
public void pauseScheduleJob(String jobName,String jobGroup) throws Exception;
public void resumeScheduleJob(String jobName,String jobGroup) throws Exception;
public void deleteScheduleJob(String jobName,String jobGroup) throws Exception;
public void rescheduleScheduleJob(String jobName,String jobGroup,String cronExpression) throws Exception;
public void addScheduleJob(String jobName,String jobGroup,String cronExpression) throws Exception;
public void triggerScheduleJob(String jobName,String jobGroup) throws Exception;
}

其中,增加任务的代码基本跟上一文中的test.java中的方法一样,就不再赘述了,下面提供比较麻烦的getJobList()和rescheduleScheduleJob方法的主要代码。

public List<SDDataJob> getJobList() throws Exception {
//查询计划中的任务
List<SDDataJob> list = new ArrayList<SDDataJob>();
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = schedulerFactoryBean.getJobKeys(matcher);
for(JobKey jobKey : jobKeys){
List<? extends Trigger> triggers = schedulerFactoryBean.getTriggersOfJob(jobKey);
for(Trigger trigger : triggers){
SDDataJob job = new SDDataJob();
job.setJobName(jobKey.getName());
job.setJobGroup(jobKey.getGroup());
job.setDesc("触发器:" + trigger.getKey());
Trigger.TriggerState triggerState = schedulerFactoryBean.getTriggerState(trigger.getKey());
job.setJobStatus(triggerState.name());
if(trigger instanceof CronTriggerImpl){
CronTriggerImpl cronTrigger = (CronTriggerImpl) trigger;
job.setCronExpression(cronTrigger.getCronExpression());
}
list.add(job);
}
}
return list;
}
public void rescheduleScheduleJob(String jobName, String jobGroup,String cronExpression) throws Exception {//更新表达式之前需要先暂停任务的执行JobKey jobkey = JobKey.jobKey(jobName, jobGroup);schedulerFactoryBean.pauseJob(jobkey);//更新任务的执行表达式TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);CronTriggerImpl trigger = (CronTriggerImpl) schedulerFactoryBean.getTrigger(triggerKey);//表达式调度构建器CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);trigger = (CronTriggerImpl) trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();schedulerFactoryBean.rescheduleJob(triggerKey, trigger);}


二、编写任务管理的服务类ISDDataJobManagerService

服务类中主要对调用之后需要回传的数据进行封装以及回传前的处理,并没有什么可以写的,这里就不再赘述。


三、编写Web页面调用的Action

这里主要是对页面调用的方法的编写,我使用的是Ajax异步调用,之前写的也比较多了,这里就再贴一下异步返回数据的主要代码吧。

private void write(String result){
//私有方法,向客户端写入信息
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
PrintWriter pw = null;
try {
pw = response.getWriter();
pw.write(result);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
pw.close();
}
}


四、编写Web管理页面

这里也没什么可以说的,基本就是显示的问题,唯一可以说的就是Ajax异步调用及回传显示的方法,这里就简单贴一下这方面的代码吧。

function get_job_list(){
// 获取任务列表
$.ajax({
url:"SDDataJobManager/ajaxGetJobList.action",
type:"post",
dataType:"json",
success:function(result){
var html = "";
$.each(result,function(index,item){
html += "<tr>";
html += "<td>" + item.jobName + "</td>";
html += "<td>" + item.jobGroup + "</td>";
html += "<td>" + item.cronExpression + "</td>";
html += "<td>" + item.jobStatus + "</td>";
html += "<td>" + item.desc + "</td>";
html += "<td> <button onclick='clickPause(\"" + item.jobName + "\",\"" + item.jobGroup + "\")'>暂停</button>  ";
html += "<button onclick='clickResume(\"" + item.jobName + "\",\"" + item.jobGroup + "\")'>恢复</button>  ";
html += "<button onclick='clickDelete(\"" + item.jobName + "\",\"" + item.jobGroup + "\")'>删除</button>  ";
html += "<button onclick='clickReschedule(\"" + item.jobName + "\",\"" + item.jobGroup + "\")'>重置时间表达式</button>  "
html += "<button onclick='clickTrigger(\"" + item.jobName + "\",\"" + item.jobGroup + "\")'>立即执行一次</button>";
html += "</td>";
html += "</tr>";
});
$("#job_list").html(html);
},
error: function (e, jqxhr, settings, exception) {
alert("请求发生错误...");
}
});
}


最后运行的web管理页面如下。

定时任务服务开发笔记(2)——开发Web端任务管理页面

嗯,虽然丑是丑,但是基本的功能还是都有了~

接下去就要考虑执行复杂任务的时候,需要再建相应的任务详情表来关联了,这个接下去再继续做,不过就不再跟定时任务有那么多的关系了。

定时任务的开发到这里就到一段落。