You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.2 KiB
135 lines
5.2 KiB
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Quartz;
|
|
using Quartz.Impl;
|
|
using Quartz.Impl.Triggers;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Threading.Tasks;
|
|
using VOL.Core.Configuration;
|
|
using VOL.Core.EFDbContext;
|
|
using VOL.Core.Utilities;
|
|
using VOL.Entity.DomainModels;
|
|
|
|
namespace VOL.Core.Quartz
|
|
{
|
|
public class HttpResultfulJob : IJob
|
|
{
|
|
readonly IHttpClientFactory _httpClientFactory;
|
|
|
|
readonly IServiceProvider _serviceProvider;
|
|
/// <summary>
|
|
/// 2020.05.31增加构造方法
|
|
/// </summary>
|
|
/// <param name="serviceProvider"></param>
|
|
/// <param name="httpClientFactory"></param>
|
|
public HttpResultfulJob(IServiceProvider serviceProvider, IHttpClientFactory httpClientFactory)
|
|
{
|
|
_httpClientFactory = httpClientFactory;
|
|
_serviceProvider = serviceProvider;
|
|
}
|
|
public async Task Execute(IJobExecutionContext context)
|
|
{
|
|
DateTime dateTime = DateTime.Now;
|
|
Sys_QuartzOptions taskOptions = context.GetTaskOptions();
|
|
string httpMessage = "";
|
|
AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
|
|
if (taskOptions == null)
|
|
{
|
|
Console.WriteLine($"未获取到作业");
|
|
return;
|
|
}
|
|
if (string.IsNullOrEmpty(taskOptions.ApiUrl) || taskOptions.ApiUrl == "/")
|
|
{
|
|
Console.WriteLine($"未配置作业:{taskOptions.TaskName}的url地址");
|
|
QuartzFileHelper.Error($"未配置作业:{taskOptions.TaskName}的url地址");
|
|
return;
|
|
}
|
|
string exceptionMsg = null;
|
|
|
|
try
|
|
{
|
|
using (var dbContext = new SysDbContext())
|
|
{
|
|
var _taskOptions = dbContext.Set<Sys_QuartzOptions>().AsTracking()
|
|
.Where(x => x.Id == taskOptions.Id).FirstOrDefault();
|
|
|
|
if (_taskOptions != null)
|
|
{
|
|
dbContext.Update(_taskOptions);
|
|
var entry = dbContext.Entry(_taskOptions);
|
|
entry.State = EntityState.Unchanged;
|
|
entry.Property("LastRunTime").IsModified = true;
|
|
_taskOptions.LastRunTime = DateTime.Now;
|
|
dbContext.SaveChanges();
|
|
}
|
|
}
|
|
|
|
Dictionary<string, string> header = new Dictionary<string, string>();
|
|
if (!string.IsNullOrEmpty(taskOptions.AuthKey)
|
|
&& !string.IsNullOrEmpty(taskOptions.AuthValue))
|
|
{
|
|
header.Add(taskOptions.AuthKey.Trim(), taskOptions.AuthValue.Trim());
|
|
}
|
|
|
|
httpMessage = await _httpClientFactory.SendAsync(
|
|
taskOptions.Method?.ToLower() == "get" ? HttpMethod.Get : HttpMethod.Post,
|
|
taskOptions.ApiUrl,
|
|
taskOptions.PostData,
|
|
taskOptions.TimeOut ?? 180,
|
|
header); ;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
exceptionMsg = ex.Message + ex.StackTrace;
|
|
}
|
|
finally
|
|
{
|
|
try
|
|
{
|
|
var log = new Sys_QuartzLog
|
|
{
|
|
LogId = Guid.NewGuid(),
|
|
TaskName = taskOptions.TaskName,
|
|
Id = taskOptions.Id,
|
|
CreateDate = dateTime,
|
|
ElapsedTime = Convert.ToInt32((DateTime.Now - dateTime).TotalSeconds),
|
|
ResponseContent = httpMessage,
|
|
ErrorMsg = exceptionMsg,
|
|
StratDate = dateTime,
|
|
Result = exceptionMsg == null ? 1 : 0,
|
|
EndDate = DateTime.Now
|
|
};
|
|
using (var dbContext = new SysDbContext())
|
|
{
|
|
dbContext.Set<Sys_QuartzLog>().Add(log);
|
|
dbContext.SaveChanges();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"日志写入异常:{taskOptions.TaskName},{ex.Message}");
|
|
QuartzFileHelper.Error($"日志写入异常:{typeof(HttpResultfulJob).Name},{taskOptions.TaskName},{ex.Message}");
|
|
}
|
|
}
|
|
Console.WriteLine(trigger.FullName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss") + " " + httpMessage);
|
|
return;
|
|
}
|
|
}
|
|
public class TaskOptions
|
|
{
|
|
public string TaskName { get; set; }
|
|
public string GroupName { get; set; }
|
|
public string Interval { get; set; }
|
|
public string ApiUrl { get; set; }
|
|
public string AuthKey { get; set; }
|
|
public string AuthValue { get; set; }
|
|
public string Describe { get; set; }
|
|
public string RequestType { get; set; }
|
|
public DateTime? LastRunTime { get; set; }
|
|
public int Status { get; set; }
|
|
}
|
|
}
|