优化任务日志
This commit is contained in:
parent
27efa6309f
commit
cae6444d96
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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 {
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user