优化任务日志

This commit is contained in:
不做码农 2021-12-25 14:42:20 +08:00
parent 27efa6309f
commit cae6444d96
6 changed files with 64 additions and 47 deletions

View File

@ -139,7 +139,9 @@ namespace ZR.Admin.WebApi.Controllers
IntervalSecond = parm.IntervalSecond, IntervalSecond = parm.IntervalSecond,
JobParams = parm.JobParams, JobParams = parm.JobParams,
Update_by = User.Identity.Name, Update_by = User.Identity.Name,
Update_time = DateTime.Now Update_time = DateTime.Now,
BeginTime = parm.BeginTime,
EndTime = parm.EndTime
}); });
if (response > 0) if (response > 0)
{ {

View File

@ -79,7 +79,7 @@ namespace ZR.Model.System.Dto
/// 默认 : /// 默认 :
/// </summary> /// </summary>
[Display(Name = "开始时间")] [Display(Name = "开始时间")]
public DateTime BeginTime { get; set; } public DateTime? BeginTime { get; set; }
/// <summary> /// <summary>
/// 描述 : 结束时间 /// 描述 : 结束时间
@ -87,7 +87,7 @@ namespace ZR.Model.System.Dto
/// 默认 : /// 默认 :
/// </summary> /// </summary>
[Display(Name = "结束时间")] [Display(Name = "结束时间")]
public DateTime EndTime { get; set; } public DateTime? EndTime { get; set; }
/// <summary> /// <summary>
/// 描述 : 触发器类型0、simple 1、cron /// 描述 : 触发器类型0、simple 1、cron
@ -186,7 +186,7 @@ namespace ZR.Model.System.Dto
/// 默认 : /// 默认 :
/// </summary> /// </summary>
[Display(Name = "开始时间")] [Display(Name = "开始时间")]
public string BeginTime { get; set; } public DateTime? BeginTime { get; set; }
/// <summary> /// <summary>
/// 描述 : 结束时间 /// 描述 : 结束时间
@ -194,7 +194,7 @@ namespace ZR.Model.System.Dto
/// 默认 : /// 默认 :
/// </summary> /// </summary>
[Display(Name = "结束时间")] [Display(Name = "结束时间")]
public string EndTime { get; set; } public DateTime? EndTime { get; set; }
/// <summary> /// <summary>
/// 描述 : 触发器类型0、simple 1、cron /// 描述 : 触发器类型0、simple 1、cron

View File

@ -24,9 +24,9 @@ namespace ZR.Tasks
/// <param name="job">业务逻辑方法</param> /// <param name="job">业务逻辑方法</param>
public async Task<Dictionary<string,object>> ExecuteJob(IJobExecutionContext context, Func<Task> job) public async Task<Dictionary<string,object>> ExecuteJob(IJobExecutionContext context, Func<Task> job)
{ {
string logMsg = "";
double elapsed = 0; double elapsed = 0;
int status = 0; int status = 0;
string logMsg;
try try
{ {
//var s = context.Trigger.Key.Name; //var s = context.Trigger.Key.Name;
@ -64,6 +64,7 @@ namespace ZR.Tasks
protected void RecordTaskLog(IJobExecutionContext context, Dictionary<string, object> executeLog) protected void RecordTaskLog(IJobExecutionContext context, Dictionary<string, object> executeLog)
{ {
var tasksLogService = (ISysTasksLogService)App.GetRequiredService(typeof(ISysTasksLogService)); var tasksLogService = (ISysTasksLogService)App.GetRequiredService(typeof(ISysTasksLogService));
var taskQzService = (ISysTasksQzService)App.GetRequiredService(typeof(ISysTasksQzService));
// 可以直接获取 JobDetail 的值 // 可以直接获取 JobDetail 的值
IJobDetail job = context.JobDetail; IJobDetail job = context.JobDetail;
@ -80,7 +81,10 @@ namespace ZR.Tasks
logModel.JobMessage = executeLog.GetValueOrDefault("content").ToString(); logModel.JobMessage = executeLog.GetValueOrDefault("content").ToString();
logModel.Status = executeLog.GetValueOrDefault("status", "0").ToString(); logModel.Status = executeLog.GetValueOrDefault("status", "0").ToString();
logModel = tasksLogService.AddTaskLog(job.Key.Name, logModel); logModel = tasksLogService.AddTaskLog(job.Key.Name, logModel);
taskQzService.Update(f => f.ID == job.Key.Name, f => new SysTasksQz()
{
RunTimes = f.RunTimes + 1
});
logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}"); logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}");
} }
} }

View File

@ -6,7 +6,6 @@ namespace ZR.Tasks
/// <summary> /// <summary>
/// 定时任务测试 /// 定时任务测试
/// </summary> /// </summary>
//[AppService(ServiceLifetime = LifeTime.Scoped)]
public class Job_SyncTest : JobBase, IJob public class Job_SyncTest : JobBase, IJob
{ {
//private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); //private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
@ -21,7 +20,6 @@ namespace ZR.Tasks
await Task.Delay(1); await Task.Delay(1);
//TODO 业务逻辑 //TODO 业务逻辑
//throw new System.Exception("error");
} }
} }
} }

View File

@ -4,7 +4,8 @@
<el-col> <el-col>
<el-form :inline="true" @submit.native.prevent> <el-form :inline="true" @submit.native.prevent>
<el-form-item> <el-form-item>
<el-input v-model="queryParams.queryText" placeholder="请输入计划任务名称" clearable prefix-icon="el-icon-search" @keyup.enter.native="handleQuery" @clear="handleQuery" /> <el-input v-model="queryParams.queryText" placeholder="请输入计划任务名称" clearable prefix-icon="el-icon-search" @keyup.enter.native="handleQuery"
@clear="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
@ -27,37 +28,43 @@
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['monitor:job:export']">导出</el-button> <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['monitor:job:export']">导出</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button plain v-hasPermi="['monitor:job:query']" type="info" icon="el-icon-s-operation" size="mini" @click="handleJobLog({id: 1})">日志</el-button> <el-button plain v-hasPermi="['monitor:job:query']" type="info" icon="el-icon-s-operation" size="mini" @click="handleJobLog({id: 1})">日志
</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="searchToggle" @queryTable="handleQuery"></right-toolbar> <right-toolbar :showSearch.sync="searchToggle" @queryTable="handleQuery"></right-toolbar>
</el-row> </el-row>
<el-row> <el-row>
<el-table ref="tasks" v-loading="loading" :data="dataTasks" border="" row-key="id" :height="tableHeight*0.65" @sort-change="handleSortable" @selection-change="handleSelectionChange"> <el-table ref="tasks" v-loading="loading" :data="dataTasks" border="" row-key="id" :height="tableHeight*0.65" @sort-change="handleSortable"
@selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" /> --> <!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column type="index" :index="handleIndexCalc" label="#" align="center" /> <el-table-column type="index" :index="handleIndexCalc" label="#" align="center" />
<el-table-column prop="name" :show-overflow-tooltip="true" label="任务名称" /> <el-table-column prop="name" :show-overflow-tooltip="true" label="任务名称" />
<el-table-column prop="jobGroup" :show-overflow-tooltip="true" align="center" label="任务分组" /> <el-table-column prop="jobGroup" :show-overflow-tooltip="true" align="center" label="任务分组" />
<el-table-column prop="assemblyName" align="center" label="程序集名称" :show-overflow-tooltip="true" /> <el-table-column prop="assemblyName" align="center" label="程序集名称" :show-overflow-tooltip="true" />
<el-table-column prop="className" align="center" label="任务类名" :show-overflow-tooltip="true" /> <el-table-column prop="className" align="center" label="任务类名" :show-overflow-tooltip="true" />
<el-table-column prop="runTimes" align="center" label="运行次数"/>
<el-table-column prop="cron" align="center" label="运行表达式" /> <el-table-column prop="cron" align="center" label="运行表达式" />
<el-table-column sortable prop="isStart" align="center" label="状态" width="90"> <el-table-column sortable prop="isStart" align="center" label="状态" width="90">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag size="mini" :type="scope.row.isStart ? 'success' : 'danger'" disable-transitions>{{ scope.row.isStart ? "运行中":"已停止" }}</el-tag> <el-tag size="mini" :type="scope.row.isStart ? 'success' : 'danger'" disable-transitions>{{ scope.row.isStart ? "运行中":"已停止" }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="300" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" width="250" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" size="mini" icon="el-icon-view" v-hasPermi="['monitor:job:query']"> <el-button type="text" size="mini" icon="el-icon-view" v-hasPermi="['monitor:job:query']">
<router-link :to="{path: 'job/log', query: {jobId: scope.row.id}}">日志</router-link> <router-link :to="{path: 'job/log', query: {jobId: scope.row.id}}">日志</router-link>
</el-button> </el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:run']" size="mini" icon="el-icon-remove" title="运行"
@click="handleRun(scope.row)">运行</el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:stop']" size="mini" icon="el-icon-video-pause" style="color:red"
title="停止" @click="handleStop(scope.row)">停止</el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:run']" size="mini" icon="el-icon-remove" title="运行" @click="handleRun(scope.row)">运行</el-button> <el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:start']" size="mini" icon="el-icon-video-play" title="启动"
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:stop']" size="mini" icon="el-icon-video-pause" style="color:red" title="停止" @click="handleStop(scope.row)">停止</el-button> @click="handleStart(scope.row)">启动</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:edit']" size="mini" icon="el-icon-edit" style="color:gray"
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:start']" size="mini" icon="el-icon-video-play" title="启动" @click="handleStart(scope.row)">启动</el-button> title="编辑" @click="handleUpdate(scope.row)">编辑</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:edit']" size="mini" icon="el-icon-edit" style="color:gray" title="编辑" @click="handleUpdate(scope.row)">编辑</el-button> <el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:delete']" size="mini" icon="el-icon-delete" style="color:red"
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:delete']" size="mini" icon="el-icon-delete" style="color:red" title="删除" @click="handleDelete(scope.row)">删除</el-button> title="删除" @click="handleDelete(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -91,11 +98,6 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="任务状态">
<el-tag>{{form.isStart? "运行中":"已停止" }}</el-tag>
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="程序集名称" maxlength="200" prop="assemblyName"> <el-form-item label="程序集名称" maxlength="200" prop="assemblyName">
<el-input v-model="form.assemblyName" placeholder="请输入程序集名称" /> <el-input v-model="form.assemblyName" placeholder="请输入程序集名称" />
@ -111,36 +113,41 @@
<el-input v-model="form.jobParams" placeholder="传入参数" /> <el-input v-model="form.jobParams" placeholder="传入参数" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="16" v-show="form.triggerType == 1">
<el-form-item v-show="form.triggerType == 1" label="间隔(Cron)" prop="cron"> <el-form-item label="间隔(Cron)" prop="cron">
<el-input v-model="form.cron" placeholder="如10分钟执行一次0/0 0/10 * * * ?" /> <el-input v-model="form.cron" placeholder="如10分钟执行一次0/0 0/10 * * * ?" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8" v-show="form.triggerType == 1">
<el-form-item label-width="20px"> <el-form-item label-width="20px">
<el-link href="https://cron.qqe2.com/" type="primary" target="_blank" class="mr10">cyon在线生成</el-link> <el-link href="https://cron.qqe2.com/" type="primary" target="_blank" class="mr10">cyon在线生成</el-link>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="12">
<el-form-item v-show="form.triggerType == 0" label="开始日期" prop="beginTime"> <el-form-item label="开始日期" prop="beginTime">
<el-date-picker v-model="form.beginTime" style="width:100%" type="date" placeholder="选择开始日期" /> <el-date-picker v-model="form.beginTime" style="width:100%" type="date" placeholder="选择开始日期" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="12">
<el-form-item v-show="form.triggerType == 0" label="结束日期" prop="endTime"> <el-form-item label="结束日期" prop="endTime">
<el-date-picker v-model="form.endTime" style="width:100%" type="date" placeholder="选择结束日期" /> <el-date-picker v-model="form.endTime" style="width:100%" type="date" placeholder="选择结束日期" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item v-show="form.triggerType == 0" label="执行间隔(单位:秒)" prop="intervalSecond"> <el-form-item v-show="form.triggerType == 0" label="执行间隔(秒)" prop="intervalSecond">
<el-input-number v-model="form.intervalSecond" :max="9999999999" step-strictly controls-position="right" :min="1" /> <el-input-number v-model="form.intervalSecond" :max="9999999999" step-strictly controls-position="right" :min="1" />
</el-form-item> </el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="form.remark"/>
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button> <el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
@ -155,10 +162,10 @@ import {
startTasks, startTasks,
stopTasks, stopTasks,
runTasks, runTasks,
exportTasks exportTasks,
} from "@/api/monitor/job"; } from "@/api/monitor/job";
export default { export default {
name: "tasks", name: "job",
data() { data() {
var cronValidate = (rule, value, callback) => { var cronValidate = (rule, value, callback) => {
if (this.form.triggerType === 1) { if (this.form.triggerType === 1) {
@ -235,14 +242,19 @@ export default {
}, },
// //
dataTasks: [], dataTasks: [],
//
isStartOptions: [
{ dictLabel: "运行中", dictValue: "true" },
{ dictLabel: "已停止", dictValue: "false", listClass: "danger" },
],
// //
jobGroupOptions: [], jobGroupOptions: [],
// //
triggerTypeOptions: [ triggerTypeOptions: [
// { {
// label: 'Simple / []', label: "Simple / [普通]",
// value: 0 value: 0,
// }, },
{ {
label: "Cron / [表达式]", label: "Cron / [表达式]",
value: 1, value: 1,
@ -280,7 +292,6 @@ export default {
}, },
created() { created() {
this.getList(); this.getList();
this.getDicts("sys_job_group").then((response) => { this.getDicts("sys_job_group").then((response) => {
this.jobGroupOptions = response.data; this.jobGroupOptions = response.data;
}); });
@ -468,10 +479,12 @@ export default {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning", type: "warning",
}).then(() => { })
.then(() => {
return exportTasks(); return exportTasks();
}).then(response => { })
this.download(response.data.path) .then((response) => {
this.download(response.data.path);
}); });
}, },
}, },

View File

@ -108,7 +108,7 @@ import {
} from "@/api/monitor/jobLog"; } from "@/api/monitor/jobLog";
export default { export default {
name: "JobLog", name: "job/log",
data() { data() {
return { return {
// //