using Learun.Application.Base.SystemModule;
using Learun.Ioc;
using Learun.Util;
using Quartz;
using System;
using System.Threading;
namespace Learun.Application.Extention.TaskScheduling
{
///
/// 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架
/// Copyright (c) 2013-2018 上海力软信息技术有限公司
/// 创 建:超级管理员
/// 日 期:2019-01-09 16:07
/// 描 述:任务计划模板信息
///
public class SchedulingHelper : IJob
{
private TSProcessIBLL tSProcessIBLL = new TSProcessBLL();
private TSSchemeIBLL tSSchemeIBLL = new TSSchemeBLL();
private TSLogIBLL tSLogIBLL = new TSLogBLL();
private DatabaseLinkIBLL databaseLinkIBLL = new DatabaseLinkBLL();
///
/// 任务执行方法
///
/// 任务进程主键
///
private bool _Execute(string keyValue) {
bool isOk = true;
string msg = "执行成功";
TSProcessEntity tSProcessEntity = null;
TSSchemeEntity tSSchemeEntity = null;
// 获取一个任务进程
try
{
tSProcessEntity = tSProcessIBLL.GetProcessEntity(keyValue);
}
catch (Exception ex)
{
isOk = false;
msg = "获取任务进程异常:" + ex.Message;
}
if (tSProcessEntity != null && tSProcessEntity.F_State != 1 && tSProcessEntity.F_State != 2) {
return true;
}
// 获取对应的任务模板
if (isOk)
{
try
{
tSSchemeEntity = tSSchemeIBLL.GetSchemeEntity(tSProcessEntity.F_SchemeId);
}
catch (Exception ex)
{
isOk = false;
msg = "获取任务模板异常:" + ex.Message;
}
}
bool flag = false;
// 执行任务
if (isOk)
{
try
{
TSSchemeModel tSSchemeModel = tSSchemeEntity.F_Scheme.ToObject();
switch (tSSchemeModel.methodType)
{
case 1:// sql
databaseLinkIBLL.ExecuteBySql(tSSchemeModel.dbId, tSSchemeModel.strSql);
break;
case 2:// 存储过程
databaseLinkIBLL.ExecuteByProc(tSSchemeModel.dbId, tSSchemeModel.procName);
break;
case 3:// 接口
if (tSSchemeModel.urlType == "1")
{
HttpMethods.Get(tSSchemeModel.url);
}
else
{
HttpMethods.Post(tSSchemeModel.url);
}
break;
case 4:// 依赖注入
if (!string.IsNullOrEmpty(tSSchemeModel.iocName) && UnityIocHelper.TsInstance.IsResolve(tSSchemeModel.iocName))
{
ITsMethod iTsMethod = UnityIocHelper.TsInstance.GetService(tSSchemeModel.iocName);
iTsMethod.Execute();
}
break;
}
if (tSSchemeModel.executeType == 1) {
flag = true;
}
}
catch (Exception ex)
{
isOk = false;
msg = "执行方法出错:" + ex.Message;
}
}
try
{
// 新增一条任务日志
TSLogEntity logEntity = new TSLogEntity()
{
F_ExecuteResult = isOk ? 1 : 2,
F_Des = msg,
F_ProcessId = keyValue
};
logEntity.Create();
tSLogIBLL.SaveEntity("", logEntity);
if (tSProcessEntity.F_State == 1) {
tSProcessEntity.F_State = 2;
if (flag) {
tSProcessEntity.F_State = 4;
}
tSProcessIBLL.SaveEntity(tSProcessEntity.F_Id, tSProcessEntity);
}
}
catch (Exception)
{
}
return isOk;
}
///
/// 任务执行方法
///
///
public void Execute(IJobExecutionContext context)
{
try
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string keyValue = dataMap.GetString("keyValue");
TSProcessEntity tSProcessEntity = null;
TSSchemeEntity tSSchemeEntity = null;
if (!_Execute(keyValue)) { // 如果异常,需要重新执行一次
tSProcessEntity = tSProcessIBLL.GetProcessEntity(keyValue);
if (tSProcessEntity != null) {
tSSchemeEntity = tSSchemeIBLL.GetSchemeEntity(tSProcessEntity.F_SchemeId);
if (tSSchemeEntity != null)
{
TSSchemeModel tSSchemeModel = tSSchemeEntity.F_Scheme.ToObject();
if (tSSchemeModel.isRestart == 1) {
for (int i = 0; i < tSSchemeModel.restartNum; i++)
{
Thread.Sleep(60 * 1000 * tSSchemeModel.restartMinute); // 停顿1000毫秒
if (_Execute(keyValue))
{
break;
}
}
}
}
}
}
}
catch (Exception)
{
}
}
}
}