using Newtonsoft.Json;
using Rhea.Common;
using Sundial;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Minsun;
using static System.Collections.Specialized.BitVector32;
namespace Tiger.Business
{
public class InterfaceServiceNew: IInterfaceService
{
public ISchedulerFactory _schedulerFactory { get; set; }
///
/// 设置计划任务工厂类
///
///
public void SetSchedulerFactory(ISchedulerFactory schedulerFactory)
{
_schedulerFactory = schedulerFactory;
}
///
/// 根据实体类名及作业名称添加作业
///
///
///
///
public ApiAction AddJob(TJob newEntity, TskJobParam jobParam) where TJob : class, IJob
{
ApiAction apiAction = new();
TriggerBuilder triggerBuilder = Triggers.Period(jobParam.Period*60*1000).LoadFrom(new
{
TriggerId = jobParam.JobName + "_trigger1",
});
_schedulerFactory.AddJob(jobParam.JobName, triggerBuilder);
var trigger = GetJob(jobParam.JobName).GetTrigger($"{jobParam.JobName}_trigger1");
TSK_JOB entity = ReturnDetail(jobParam.JobName);
entity.Remark = jobParam.Remark;
entity.JobType = typeof(TJob).Name;
entity.JobName = jobParam.JobName;
entity.TriggersWithGhost = new List { JsonConvert.DeserializeObject(JsonConvert.SerializeObject(trigger)) };
entity.Triggers[0].Args = jobParam.Period.ToString();
apiAction = SaveJob(entity);
apiAction.Data = entity;
return apiAction;
}
///
/// 根据作业名称添加作业
///
///
///
///
public ApiAction AddJob(string jobname, params TriggerBuilder[] triggerBuilders) where TJob : class, IJob
{
ApiAction apiAction = new();
triggerBuilders[0].LoadFrom(new
{
TriggerId = jobname + "_trigger1",
});
_schedulerFactory.AddJob(jobname, triggerBuilders);
var trigger = GetJob(jobname).GetTrigger($"{jobname}_trigger1");
TSK_JOB entity = ReturnDetail(jobname);
entity.TriggersWithGhost = new List { JsonConvert.DeserializeObject(JsonConvert.SerializeObject(trigger)) };
apiAction = SaveJob(entity);
apiAction.Data = entity;
return apiAction;
}
///
/// 更新作业
///
///
///
public ApiAction UpdateJob(TSK_JOB job)
{
ApiAction apiAction = new ApiAction();
IScheduler scheduler = GetJob(job.JobName);
var trigger = scheduler.GetTrigger($"{job.JobName}_trigger1");
if (trigger.Status == TriggerStatus.Running)
{
apiAction.IsSuccessed = false;
apiAction.Message = $"作业[{job.JobName}]正在运行不能编辑";
}
var triggerEntity = Biz.Db.Queryable().Where(x => x.JobId == job.ID).First();
if (triggerEntity != null)
{
triggerEntity.Status = (int)trigger.Status;
triggerEntity.Args = job.uPeriod.ToString();
}
var db = Business.Biz.Db;
//保存到数据库
var dbTran = db.UseTran(() =>
{
if (job != null)
{
db.Updateable(job, "system").ExecuteCommand();
}
if (triggerEntity != null)
{
db.Updateable(triggerEntity, "system").ExecuteCommand();
}
});
if (!dbTran.IsSuccess)
{
apiAction.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"作业保存到数据库异常");
}
//更新触发器周期
scheduler.UpdateTrigger($"{job.JobName}_trigger1", triggerBuilder =>
{
triggerBuilder.SetArgs(job.uPeriod * 60 * 1000);
}); ;
return apiAction;
}
private TSK_JOB ReturnDetail(string jobname)
{
var jobDetail = GetJob(jobname).GetJobDetail();
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(jobDetail));
}
///
/// 启动所有作业
///
public void StartAllJob()
{
_schedulerFactory.StartAll();
}
///
/// 启动单个作业
///
///
public void StartJob(string jobname)
{
// 带返回值
IScheduler scheduler;
var scheduleResult = _schedulerFactory.TryRunJob(jobname, out scheduler);
}
///
/// 获取单个作业
///
///
///
public IScheduler GetJob(string jobname)
{
IScheduler scheduler;
var scheduleResult = _schedulerFactory.TryGetJob(jobname, out scheduler);
return scheduler;
}
///
/// 获取所有作业
///
///
public List GetJobs()
{
return _schedulerFactory.GetJobs().ToList();
}
///
/// 暂停作业
///
///
public void PauseJob(string jobname)
{
var scheduler = GetJob(jobname);
if (scheduler != null)
{
scheduler.Pause();
}
}
///
/// 删除作业
///
///
public void RemoveJob(string jobname)
{
var scheduler = GetJob(jobname);
if (scheduler != null)
{
scheduler.Remove();
}
}
///
/// 从数据库加载作业
///
public void AddJobFromDB()
{
try
{
var jobs = Biz.Db.Queryable().IncludesAllFirstLayer().ToList();
foreach (var job in jobs)
{
Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true);
_schedulerFactory.AddJob(type, job.JobName, Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000));
if (job.Triggers[0]?.Status == 3)
{
Work.DoAsync(() =>
{
Thread.Sleep(2000);
PauseJob(job.JobName);
});
}
}
}
catch (System.Exception ex)
{
Logger.Console.Fatal(ex, "Add Job From DB Exception");
}
}
///
/// 作业保存到数据库
///
///
private ApiAction SaveJob(TSK_JOB entity)
{
var action = new ApiAction();
entity.ID = Guid.NewGuid().ToString("N");
entity.Triggers[0].JobId = entity.ID;
if (Biz.Db.Queryable().Where(x => x.JobName == entity.JobName && x.JobType == entity.JobType && x.AssemblyName == entity.AssemblyName).Any())
{
action.IsSuccessed = false;
action.Message = $"作业已经存在,不能保存数据";
return action;
}
var db = Business.Biz.Db;
//保存到数据库
var dbTran = db.UseTran(() =>
{
if (entity != null)
{
db.Insertable(entity, "system").ExecuteCommand();
}
if (entity.Triggers.Any())
{
db.Insertable(entity.Triggers, "system").ExecuteCommand();
}
});
if (!dbTran.IsSuccess)
{
action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"作业保存到数据库异常");
}
return action;
}
}
}