项目介绍
我们经常会开发一些定时任务的程序,基本上都是打包成jar然后执行的,任务多了就无法统一管理,所以开发了此系统,对所有任务进行可视化的管理,发布任务,重启任务,停止任务,实时异常监控等等。
本源码仅供各位学习参考。数据库表可以根据项目中的实体类去建表,不提供原始sql文件。
主要技术如下:
spring mvc
mysql
统一异常处理以及日志记录(自定义注解方式)
websocket处理异常实时推送到页面显示
多任务调度
jquery自定义插件(表格插件,表单插件,消息框插件,下拉框插件)
工程包列表
插件列表
表格插件使用
$(function(){
//注册表格
var registerTable = function(){
//控制器接收分页参数的名称:当前页是currentPage页大小pageSize
$("#execLogTable").table({
url:baseUrl+"protected/task/queryTaskExecLogByPage.htm",
method:"post",
align:"center",
pageBarAlign:"right",
pageSize:10,
queryformId:"queryExecLogForm",
pageSizeList:"{10,20,50}",
isPage:true,
model:[
{field:"taskName",label:"任务名称",width:240},
{field:"executeTime",label:"执行时间",width:200},
{field:"execPeriod",label:"执行周期(分钟)",width:200},
{field:"execResult",label:"执行结果",width:200}
]
});
};
registerTable();
});
WebSocket连接池
public class TaskInboundPool {
private static Logger logger = Logger.getLogger(TaskStatusMonitor.class);
//保存连接的MAP容器
private static final Map connections = new ConcurrentHashMap();
//向连接池中添加连接
public static void addMessageInbound(TaskInbound inbound){
connections.put(inbound.getUser(), inbound);
}
//移除连接
public static void removeMessageInbound(TaskInbound inbound){
connections.remove(inbound.getUser());
}
//向所有的用户发送消息
public static void sendMessage(String message){
try {
Set keySet = connections.keySet();
for (String key : keySet) {
TaskInbound inbound = connections.get(key);
if(inbound != null){
inbound.getWsOutbound().writeTextMessage(CharBuffer.wrap(message));
}
}
} catch (IOException e) {
logger.error("向所有的用户发送状态消息异常", e);
}
}
}
控制器代码
@RequestMapping(value="queryTaskByPage")
@ResponseBody
@ExceptionMessageTitle(value="查询任务信息出现异常")
public String queryTaskByPage(PageParamBean paramBean,String taskName) throws Exception{
Map map = new HashMap();
map.put("success", true);
PageBean page = taskService.queryTaskByPage(paramBean,taskName);
List list = CopyBeanDataUtil.copyListByDateConvert(LBTaskInfo.class, page.getList());
map.put("totalRecords", page.getTotalRecords());
map.put("data", list);
return JsonUtils.toJson(map);
}
停止任务代码示例
@Transactional
@Override
public String stopTask(Integer id) throws Exception {
LBTask task = super.getById("id",id);
String savePath = ConfigUtil.getInstance().getProcedureFileSavePath();
String runCmd = savePath + File.separator + task.getCatalogue() + File.separator + task.getRunScript();
int pid = ProcessUtil.getLinuxOSProcedureProcessId(runCmd);
if(pid < 0){
logger.info("【"+task.getTaskName()+"】分析任务没有运行,不能停止。");
LBTaskStatus taskStatus = CacheData.taskRunStatus.get(task.getId());
TaskStatusUtil.resetTaskStatus(id, taskStatus.getStatus() == null ? "未运行" : taskStatus.getStatus());
return Result.NOSTOP;
}
//停止分析任务,标记停止,下次启动时不启动已标记停止的,不能kill掉进程来停止
if(task.getExecuteSign().equals(1)){
logger.info("【"+task.getTaskName()+"】分析任务正在停止中,不能停止。");
TaskStatusUtil.resetTaskStatus(id, "正在停止");
return Result.CURRENTSTOP;
}
task.setExecuteSign(1);
super.update(task, "id");
return Result.SUCCESS;
}