1、调度监控优化

Former-commit-id: 44b8e49444d4c69dc67491f0c6c1b61c340f3064
master
王兵 5 years ago
parent 2b227382e8
commit 2b376f22ee

@ -1,33 +1,58 @@
package ${basePackage}.action.ajax.system; package ${basePackage}.action.ajax.system;
import org.springframework.beans.factory.annotation.Autowired;
import ${basePackage}.frame.base.ErrorType;
import ${basePackage}.frame.schedule.Scheduler; import ${basePackage}.frame.schedule.Scheduler;
import ${basePackage}.frame.utils.StringUtil;
import ${basePackage}.module.system.ent.Schedule; import ${basePackage}.module.system.ent.Schedule;
import ${basePackage}.module.system.req.ScheduleFindRequest; import ${basePackage}.module.system.req.ScheduleFindRequest;
import ${basePackage}.module.system.req.ScheduleStartRequest;
import ${basePackage}.module.system.req.ScheduleStopRequest;
import ${basePackage}.module.system.rsp.ScheduleFindResponse; import ${basePackage}.module.system.rsp.ScheduleFindResponse;
import org.springframework.beans.factory.annotation.Autowired; import ${basePackage}.module.system.rsp.ScheduleStartResponse;
import ${basePackage}.module.system.rsp.ScheduleStopResponse;
import java.util.Iterator;
import java.util.List; import java.util.List;
public class ScheduleAjax { public class ScheduleAjax {
@Autowired @Autowired
private Scheduler scheduler; private Scheduler scheduler;
// public TaskSqlCreateResponse create(TaskSqlCreateRequest request) { public ScheduleStartResponse start(ScheduleStartRequest request) {
// return taskSqlManager.create(request, LocalData.getToken()); ScheduleStartResponse response = new ScheduleStartResponse();
// } if (!scheduler.start(request.getId())) {
// response.addError(ErrorType.BUSINESS_ERROR, "启动失败!");
// public TaskSqlDeleteResponse delete(TaskSqlDeleteRequest request) { }
// return taskSqlManager.delete(request, LocalData.getToken()); return response;
// } }
//
// public TaskSqlUpdateResponse update(TaskSqlUpdateRequest request) { public ScheduleStopResponse stop(ScheduleStopRequest request) {
// return taskSqlManager.update(request, LocalData.getToken()); ScheduleStopResponse response = new ScheduleStopResponse();
// } if (!scheduler.stop(request.getId())) {
response.addError(ErrorType.BUSINESS_ERROR, "停止失败!");
}
return response;
}
public ScheduleFindResponse find(ScheduleFindRequest request) { public ScheduleFindResponse find(ScheduleFindRequest request) {
ScheduleFindResponse response = new ScheduleFindResponse(); ScheduleFindResponse response = new ScheduleFindResponse();
List<Schedule> schedules = scheduler.taskList(); List<Schedule> schedules = scheduler.taskList();
Iterator<Schedule> iterator = schedules.iterator();
while (iterator.hasNext()) {
Schedule next = iterator.next();
if (!StringUtil.isEmpty(request.getTaskId()) && !next.getId().contains(request.getTaskId())) {
iterator.remove();
}
if (!StringUtil.isEmpty(request.getTaskName()) && !next.getName().contains(request.getTaskName())) {
iterator.remove();
}
if (request.getRun() != null && next.isRun() != request.getRun()) {
iterator.remove();
}
}
response.setResult(schedules); response.setResult(schedules);
return response; return response;
} }

@ -14,6 +14,10 @@ public abstract class RunTask implements Runnable {
return ""; return "";
} }
public String taskNote(){
return "";
}
public abstract ScheduledFuture<?> schedule(ThreadPoolTaskScheduler poolTaskScheduler); public abstract ScheduledFuture<?> schedule(ThreadPoolTaskScheduler poolTaskScheduler);
public void configChange(ThreadPoolTaskScheduler scheduler) { public void configChange(ThreadPoolTaskScheduler scheduler) {

@ -1,7 +1,7 @@
package ${basePackage}.frame.schedule; package ${basePackage}.frame.schedule;
import ${basePackage}.module.system.ent.Schedule;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import ${basePackage}.module.system.ent.Schedule;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -24,13 +24,7 @@ public class Scheduler extends ThreadPoolTaskScheduler {
ScheduledFuture<?> scheduledFuture = taskMap.get(task.taskId()).future; ScheduledFuture<?> scheduledFuture = taskMap.get(task.taskId()).future;
scheduledFuture.cancel(false); scheduledFuture.cancel(false);
} }
taskMap.put(task.taskId(), new TaskWrapper( taskMap.put(task.taskId(), new TaskWrapper(task));
task.taskId(),
task.taskName(),
true,
(Class<RunTask>) task.getClass(),
task.schedule(this)
));
return true; return true;
} }
@ -43,13 +37,23 @@ public class Scheduler extends ThreadPoolTaskScheduler {
return true; return true;
} }
public boolean start(String taskId) {
if (taskMap.containsKey(taskId)) {
taskMap.get(taskId).run = true;
taskMap.get(taskId).future = taskMap.get(taskId).target.schedule(this);
return true;
}
return false;
}
public boolean stop(String taskId) { public boolean stop(String taskId) {
if (taskMap.containsKey(taskId)) { if (taskMap.containsKey(taskId)) {
taskMap.get(taskId).run = false; taskMap.get(taskId).run = false;
ScheduledFuture<?> scheduledFuture = taskMap.get(taskId).future; ScheduledFuture<?> scheduledFuture = taskMap.get(taskId).future;
scheduledFuture.cancel(false); scheduledFuture.cancel(false);
return true;
} }
return true; return false;
} }
public List<Schedule> taskList() { public List<Schedule> taskList() {
@ -58,6 +62,7 @@ public class Scheduler extends ThreadPoolTaskScheduler {
Schedule schedule = new Schedule(); Schedule schedule = new Schedule();
schedule.setId(taskWrapper.taskId); schedule.setId(taskWrapper.taskId);
schedule.setName(taskWrapper.taskName); schedule.setName(taskWrapper.taskName);
schedule.setNote(taskWrapper.taskNote);
schedule.setRun(taskWrapper.run); schedule.setRun(taskWrapper.run);
result.add(schedule); result.add(schedule);
} }
@ -65,18 +70,20 @@ public class Scheduler extends ThreadPoolTaskScheduler {
} }
class TaskWrapper { class TaskWrapper {
RunTask target;
String taskId; String taskId;
String taskName; String taskName;
String taskNote;
boolean run; boolean run;
Class<RunTask> target;
ScheduledFuture<?> future; ScheduledFuture<?> future;
public TaskWrapper(String taskId, String taskName, boolean run, Class<RunTask> target, ScheduledFuture<?> future) { public TaskWrapper(RunTask runTask) {
this.taskId = taskId; this.target = runTask;
this.taskName = taskName; this.taskId = runTask.taskId();
this.run = run; this.taskName = runTask.taskName();
this.target = target; this.taskNote = runTask.taskNote();
this.future = future; this.future = runTask.schedule(Scheduler.this);
this.run = true;
} }
} }
} }

@ -18,6 +18,12 @@ public class Schedule {
* NAME - * NAME -
*/ */
private String name; private String name;
/**
* NOTE -
*/
private String note;
/** /**
* run - * run -
*/ */
@ -39,6 +45,14 @@ public class Schedule {
this.name = name; this.name = name;
} }
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public boolean isRun() { public boolean isRun() {
return run; return run;
} }

@ -12,6 +12,11 @@ import ${basePackage}.frame.validation.Dict;
*/ */
public class ScheduleFindRequest extends BaseFindRequest { public class ScheduleFindRequest extends BaseFindRequest {
/**
* ID
*/
private String taskId;
/** /**
* *
*/ */
@ -31,7 +36,15 @@ public class ScheduleFindRequest extends BaseFindRequest {
/** /**
* *
*/ */
private Boolean valid; private Boolean run;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getTaskName() { public String getTaskName() {
return this.taskName; return this.taskName;
@ -57,11 +70,11 @@ public class ScheduleFindRequest extends BaseFindRequest {
this.taskType = taskType; this.taskType = taskType;
} }
public Boolean getValid() { public Boolean getRun() {
return this.valid; return run;
} }
public void setValid(Boolean valid) { public void setRun(Boolean run) {
this.valid = valid; this.run = run;
} }
} }

@ -0,0 +1,26 @@
package ${basePackage}.module.system.req;
import ${basePackage}.frame.base.BaseFindRequest;
/**
* ScheduleStartRequest -
*
* @author author
* @version 0.0.1
* @since 2020-05-24
*/
public class ScheduleStartRequest extends BaseFindRequest {
/**
* ID
*/
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

@ -0,0 +1,26 @@
package ${basePackage}.module.system.req;
import ${basePackage}.frame.base.BaseFindRequest;
/**
* ScheduleStopRequest -
*
* @author author
* @version 0.0.1
* @since 2020-05-24
*/
public class ScheduleStopRequest extends BaseFindRequest {
/**
* ID
*/
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

@ -0,0 +1,13 @@
package ${basePackage}.module.system.rsp;
import ${basePackage}.frame.base.BaseResponse;
/**
* ScheduleStartResponse -
*
* @author author
* @version 0.0.1
* @since 2020-05-24
*/
public class ScheduleStartResponse extends BaseResponse {
}

@ -0,0 +1,13 @@
package ${basePackage}.module.system.rsp;
import ${basePackage}.frame.base.BaseResponse;
/**
* ScheduleStopResponse -
*
* @author author
* @version 0.0.1
* @since 2020-05-24
*/
public class ScheduleStopResponse extends BaseResponse {
}

@ -17,7 +17,7 @@ public class TokenTask extends RunDelayRepeatTask {
@Override @Override
public String taskId() { public String taskId() {
return String.valueOf(IDgenerator.nextId()); return "1";
} }
@Override @Override
@ -25,6 +25,11 @@ public class TokenTask extends RunDelayRepeatTask {
return "登录凭证处理任务"; return "登录凭证处理任务";
} }
@Override
public String taskNote () {
return "处理过期登录凭证状态,及时注销。";
}
@Override @Override
public Duration interval() { public Duration interval() {
return Duration.ofMinutes(1); return Duration.ofMinutes(1);

@ -105,6 +105,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -68,6 +68,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -54,6 +54,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -57,6 +57,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -55,6 +55,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -48,6 +48,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -47,6 +47,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -70,6 +70,7 @@
<el-table <el-table
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -50,6 +50,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -1,16 +1,16 @@
<div id="app" v-cloak> <div id="app" v-cloak>
<el-card class="box-card"> <el-card class="box-card">
<el-form class="search" :inline="true" :model="vm" ref="vm" label-position="right" label-width="90px"> <el-form class="search" :inline="true" :model="vm" ref="vm" label-position="right" label-width="90px">
<el-form-item label="任务ID" prop="id"> <el-form-item label="任务ID" prop="taskId">
<el-input v-model="vm.id" clearable size="mini" placeholder="请输入任务名称"></el-input> <el-input v-model="vm.taskId" clearable size="mini" placeholder="请输入任务ID"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="任务名称" prop="name"> <el-form-item label="任务名称" prop="taskName">
<el-input v-model="vm.name" clearable size="mini" placeholder="请输入任务名称"></el-input> <el-input v-model="vm.taskName" clearable size="mini" placeholder="请输入任务名称"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="是否有效" prop="run"> <el-form-item label="运行状态" prop="run">
<el-radio-group v-model="vm.run" clearable size="mini"> <el-radio-group v-model="vm.run" clearable size="mini">
<el-radio :label="true"></el-radio> <el-radio :label="true">运行</el-radio>
<el-radio :label="false"></el-radio> <el-radio :label="false">暂停</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -25,6 +25,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column
@ -46,8 +47,14 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
align="center" align="center"
prop="note"
label="任务描述">
</el-table-column>
<el-table-column
align="center"
width="140"
prop="run" prop="run"
label="是否有效"> label="状态">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag size="mini" effect="dark" type="success" v-if="scope.row.run">运行</el-tag> <el-tag size="mini" effect="dark" type="success" v-if="scope.row.run">运行</el-tag>
<el-tag size="mini" effect="dark" type="danger" v-if="!scope.row.run">暂停</el-tag> <el-tag size="mini" effect="dark" type="danger" v-if="!scope.row.run">暂停</el-tag>
@ -56,13 +63,13 @@
<el-table-column <el-table-column
align="center" align="center"
fixed="right" fixed="right"
width="120" width="200"
label="操作"> label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<wb-dropdown :arg="scope.row"> <el-button-group>
<wb-dropdown-item value="编辑" icon="el-icon-edit" @click="onEdit"></wb-dropdown-item> <el-button type="primary" icon="el-icon-video-play" :disabled="scope.row.run" size="mini" @click="onStart(scope.row)">运行</el-button>
<wb-dropdown-item value="删除" icon="el-icon-delete" @click="onDelete"></wb-dropdown-item> <el-button type="primary" icon="el-icon-video-pause" :disabled="!scope.row.run" size="mini" @click="onStop(scope.row)">暂停</el-button>
</wb-dropdown> </el-button-group>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -76,71 +83,47 @@
module: 'system', module: 'system',
target: 'schedule', target: 'schedule',
vm: {//条件及分页参数 vm: {//条件及分页参数
taskId: '',
taskName: '',
taskNote: '',
taskType: '',
run: '',
pageNumber: 1, pageNumber: 1,
pageSize: 10, pageSize: 0,
totalCount: 0, totalCount: 0,
sortKey: 'CREATE_TIME', sortKey: 'CREATE_TIME',
sortType: 'DESC' sortType: 'DESC'
}, }
form: {//待提交表单
formTitle: "",
formShow: false,
id: '',
valid: "",
rowVersion: ""
},
formRules: {
},
treeData: []
}, },
methods: { methods: {
onCreate: function () { onStart: function (item) {
this.form.formTitle = "资源新增"; new Ajax("system", "schedule", "start").post({id: item.id},function (response) {
this.form.formShow = true; if (response.errors.length > 0) {
this.form.id = ""; nav.e(response.errors[0].message);
this.form.resCode = ""; } else {
this.form.resName = ""; nav.s("开启成功");
this.form.resType = ""; this.onFind();
this.form.resValue = ""; }
this.form.valid = true; }.bind(this))
},
onEdit: function (item) {
this.form.formTitle = "资源编辑";
this.form.formShow = true;
this.form.id = item.id;
this.form.resCode = item.resCode;
this.form.resName = item.resName;
this.form.resType = item.resType;
this.form.resValue = item.resValue;
this.form.valid = item.valid;
this.form.rowVersion = item.rowVersion;
}, },
onDelete: function (item) { onStop: function (item) {
this.$confirm('将删除该项, 是否继续?', '提示', { this.$confirm('停止任务后,可能导致部分模块无法正常运行,以至出现无法预料的问题,是否确认停止?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(function () { }).then(function () {
new Ajax("system", "schedule").delete({id: item.id},function (response) { new Ajax("system", "schedule", "stop").post({id: item.id},function (response) {
if (response.errors.length > 0) { if (response.errors.length > 0) {
nav.e(response.errors[0].message); nav.e(response.errors[0].message);
} else { } else {
nav.s("删除成功"); nav.s("停止成功");
this.onFind(); this.onFind();
} }
}.bind(this)) }.bind(this))
}.bind(this)).catch(function (action) { }.bind(this)).catch(function (action) {
}); });
}, }
onChange: function (value) {
this.$refs.tree.filter(value);
},
filterTree: function (value, data) {
if (!value) return true;
return data.comment.indexOf(value) !== -1;
},
}, },
mounted: function () { mounted: function () {
this.onFind(); this.onFind();

@ -56,6 +56,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -68,6 +68,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

@ -57,6 +57,7 @@
class="data" class="data"
@selection-change="onSelectionChange" @selection-change="onSelectionChange"
empty-text="无数据" empty-text="无数据"
:stripe="true"
:data="result" :data="result"
size="mini"> size="mini">
<el-table-column <el-table-column

Loading…
Cancel
Save

Powered by TurnKey Linux.