init
This commit is contained in:
85
DouyinApi.Tasks/QuartzNet/Jobs/JobBase.cs
Normal file
85
DouyinApi.Tasks/QuartzNet/Jobs/JobBase.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using DouyinApi.Common.Helper;
|
||||
using DouyinApi.IServices;
|
||||
using DouyinApi.Model.Models;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DouyinApi.Tasks
|
||||
{
|
||||
public class JobBase
|
||||
{
|
||||
public ITasksQzServices _tasksQzServices;
|
||||
public ITasksLogServices _tasksLogServices;
|
||||
public JobBase(ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices)
|
||||
{
|
||||
_tasksQzServices = tasksQzServices;
|
||||
_tasksLogServices = tasksLogServices;
|
||||
}
|
||||
/// <summary>
|
||||
/// 执行指定任务
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="action"></param>
|
||||
public async Task<string> ExecuteJob(IJobExecutionContext context, Func<Task> func)
|
||||
{
|
||||
//记录Job
|
||||
TasksLog tasksLog = new TasksLog();
|
||||
//JOBID
|
||||
int jobid = context.JobDetail.Key.Name.ObjToInt();
|
||||
//JOB组名
|
||||
string groupName = context.JobDetail.Key.Group;
|
||||
//日志
|
||||
tasksLog.JobId = jobid;
|
||||
tasksLog.RunTime = DateTime.Now;
|
||||
string jobHistory = $"【{tasksLog.RunTime.ToString("yyyy-MM-dd HH:mm:ss")}】【执行开始】【Id:{jobid},组别:{groupName}】";
|
||||
try
|
||||
{
|
||||
await func();//执行任务
|
||||
tasksLog.EndTime = DateTime.Now;
|
||||
tasksLog.RunResult = true;
|
||||
jobHistory += $",【{tasksLog.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}】【执行成功】";
|
||||
|
||||
JobDataMap jobPars = context.JobDetail.JobDataMap;
|
||||
tasksLog.RunPars = jobPars.GetString("JobParam");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
tasksLog.EndTime = DateTime.Now;
|
||||
tasksLog.RunResult = false;
|
||||
//JobExecutionException e2 = new JobExecutionException(ex);
|
||||
//true 是立即重新执行任务
|
||||
//e2.RefireImmediately = true;
|
||||
tasksLog.ErrMessage = ex.Message;
|
||||
tasksLog.ErrStackTrace = ex.StackTrace;
|
||||
jobHistory += $",【{tasksLog.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}】【执行失败:{ex.Message}】";
|
||||
}
|
||||
finally
|
||||
{
|
||||
tasksLog.TotalTime = Math.Round((tasksLog.EndTime - tasksLog.RunTime).TotalSeconds,3);
|
||||
jobHistory += $"(耗时:{tasksLog.TotalTime}秒)";
|
||||
if (_tasksQzServices != null)
|
||||
{
|
||||
var model = await _tasksQzServices.QueryById(jobid);
|
||||
if (model != null)
|
||||
{
|
||||
if(_tasksLogServices != null) await _tasksLogServices.Add(tasksLog);
|
||||
model.RunTimes += 1;
|
||||
if (model.TriggerType == 0) model.CycleHasRunTimes += 1;
|
||||
if (model.TriggerType == 0 && model.CycleRunTimes != 0 && model.CycleHasRunTimes >= model.CycleRunTimes) model.IsStart = false;//循环完善,当循环任务完成后,停止该任务,防止下次启动再次执行
|
||||
var separator = "<br>";
|
||||
// 这里注意数据库字段的长度问题,超过限制,会造成数据库remark不更新问题。
|
||||
model.Remark =
|
||||
$"{jobHistory}{separator}" + string.Join(separator, StringHelper.GetTopDataBySeparator(model.Remark, separator, 9));
|
||||
await _tasksQzServices.Update(model);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Console.Out.WriteLine(jobHistory);
|
||||
return jobHistory;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
147
DouyinApi.Tasks/QuartzNet/Jobs/Job_AccessTrendLog_Quartz.cs
Normal file
147
DouyinApi.Tasks/QuartzNet/Jobs/Job_AccessTrendLog_Quartz.cs
Normal file
@@ -0,0 +1,147 @@
|
||||
using DouyinApi.Common.LogHelper;
|
||||
using DouyinApi.IServices;
|
||||
using DouyinApi.Model.Models;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
/// <summary>
|
||||
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到
|
||||
/// </summary>
|
||||
namespace DouyinApi.Tasks
|
||||
{
|
||||
public class Job_AccessTrendLog_Quartz : JobBase, IJob
|
||||
{
|
||||
private readonly IAccessTrendLogServices _accessTrendLogServices;
|
||||
private readonly IWebHostEnvironment _environment;
|
||||
|
||||
public Job_AccessTrendLog_Quartz(IAccessTrendLogServices accessTrendLogServices, IWebHostEnvironment environment, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices)
|
||||
: base(tasksQzServices, tasksLogServices)
|
||||
{
|
||||
_accessTrendLogServices = accessTrendLogServices;
|
||||
_environment = environment;
|
||||
_tasksQzServices = tasksQzServices;
|
||||
}
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
var executeLog = await ExecuteJob(context, async () => await Run(context));
|
||||
}
|
||||
public async Task Run(IJobExecutionContext context)
|
||||
{
|
||||
|
||||
// 可以直接获取 JobDetail 的值
|
||||
var jobKey = context.JobDetail.Key;
|
||||
var jobId = jobKey.Name;
|
||||
// 也可以通过数据库配置,获取传递过来的参数
|
||||
JobDataMap data = context.JobDetail.JobDataMap;
|
||||
|
||||
var lastestLogDatetime = (await _accessTrendLogServices.Query(null, d => d.UpdateTime, false)).FirstOrDefault()?.UpdateTime;
|
||||
if (lastestLogDatetime == null)
|
||||
{
|
||||
lastestLogDatetime = Convert.ToDateTime("2021-09-01");
|
||||
}
|
||||
|
||||
var accLogs = GetAccessLogs().Where(d => d.User != "" && d.BeginTime.ObjToDate() >= lastestLogDatetime).ToList();
|
||||
var logUpdate = DateTime.Now;
|
||||
|
||||
var activeUsers = (from n in accLogs
|
||||
group n by new { n.User } into g
|
||||
select new ActiveUserVM
|
||||
{
|
||||
user = g.Key.User,
|
||||
count = g.Count(),
|
||||
}).ToList();
|
||||
|
||||
foreach (var item in activeUsers)
|
||||
{
|
||||
var user = (await _accessTrendLogServices.Query(d => d.UserInfo != "" && d.UserInfo == item.user)).FirstOrDefault();
|
||||
if (user != null)
|
||||
{
|
||||
user.Count += item.count;
|
||||
user.UpdateTime = logUpdate;
|
||||
await _accessTrendLogServices.Update(user);
|
||||
}
|
||||
else
|
||||
{
|
||||
await _accessTrendLogServices.Add(new AccessTrendLog()
|
||||
{
|
||||
Count = item.count,
|
||||
UpdateTime = logUpdate,
|
||||
UserInfo = item.user
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 重新拉取
|
||||
var actUsers = await _accessTrendLogServices.Query(d => d.UserInfo != "", d => d.Count, false);
|
||||
actUsers = actUsers.Take(15).ToList();
|
||||
|
||||
List<ActiveUserVM> activeUserVMs = new();
|
||||
foreach (var item in actUsers)
|
||||
{
|
||||
activeUserVMs.Add(new ActiveUserVM()
|
||||
{
|
||||
user = item.UserInfo,
|
||||
count = item.Count
|
||||
});
|
||||
}
|
||||
|
||||
Parallel.For(0, 1, e =>
|
||||
{
|
||||
LogLock.OutLogAOP("ACCESSTRENDLOG", "", new string[] { activeUserVMs.GetType().ToString(), JsonConvert.SerializeObject(activeUserVMs) }, false);
|
||||
});
|
||||
}
|
||||
|
||||
private List<UserAccessFromFIles> GetAccessLogs()
|
||||
{
|
||||
List<UserAccessFromFIles> userAccessModels = new();
|
||||
var accessLogs = LogLock.ReadLog(
|
||||
Path.Combine(_environment.ContentRootPath, "Log"), "RecordAccessLogs_", Encoding.UTF8, ReadType.Prefix, 2
|
||||
).ObjToString().TrimEnd(',');
|
||||
|
||||
try
|
||||
{
|
||||
return JsonConvert.DeserializeObject<List<UserAccessFromFIles>>("[" + accessLogs + "]");
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
var accLogArr = accessLogs.Split("\n");
|
||||
foreach (var item in accLogArr)
|
||||
{
|
||||
if (item.ObjToString() != "")
|
||||
{
|
||||
try
|
||||
{
|
||||
var accItem = JsonConvert.DeserializeObject<UserAccessFromFIles>(item.TrimEnd(','));
|
||||
userAccessModels.Add(accItem);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return userAccessModels;
|
||||
}
|
||||
|
||||
}
|
||||
public class UserAccessFromFIles
|
||||
{
|
||||
public string User { get; set; }
|
||||
public string IP { get; set; }
|
||||
public string API { get; set; }
|
||||
public string BeginTime { get; set; }
|
||||
public string OPTime { get; set; }
|
||||
public string RequestMethod { get; set; } = "";
|
||||
public string Agent { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
101
DouyinApi.Tasks/QuartzNet/Jobs/Job_Blogs_Quartz.cs
Normal file
101
DouyinApi.Tasks/QuartzNet/Jobs/Job_Blogs_Quartz.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using DouyinApi.IServices;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using DouyinApi.Common.Utility;
|
||||
using DouyinApi.Model.Models;
|
||||
using DouyinApi.Repository.UnitOfWorks;
|
||||
using SqlSugar;
|
||||
|
||||
/// <summary>
|
||||
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到
|
||||
/// </summary>
|
||||
namespace DouyinApi.Tasks
|
||||
{
|
||||
[DisallowConcurrentExecution]
|
||||
public class Job_Blogs_Quartz : JobBase, IJob
|
||||
{
|
||||
private readonly IBlogArticleServices _blogArticleServices;
|
||||
private readonly IGuestbookServices _guestbookServices;
|
||||
private readonly IUnitOfWorkManage _uowm;
|
||||
private readonly ISqlSugarClient _db;
|
||||
private SqlSugarScope db => _db as SqlSugarScope;
|
||||
|
||||
public Job_Blogs_Quartz(IBlogArticleServices blogArticleServices, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices,
|
||||
IGuestbookServices guestbookServices, IUnitOfWorkManage uowm, ISqlSugarClient db)
|
||||
: base(tasksQzServices, tasksLogServices)
|
||||
{
|
||||
_blogArticleServices = blogArticleServices;
|
||||
_guestbookServices = guestbookServices;
|
||||
_uowm = uowm;
|
||||
this._db = db;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 直接写就没有锁库 上下文ContextID一样
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
public async Task Execute2(IJobExecutionContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
db.BeginTran();
|
||||
Console.WriteLine(_uowm.GetDbClient().ContextID);
|
||||
await db.Insertable(new Guestbook()
|
||||
{
|
||||
username = "bbb",
|
||||
blogId = 1,
|
||||
createdate = DateTime.Now,
|
||||
isshow = true
|
||||
}).ExecuteReturnSnowflakeIdAsync();
|
||||
await db.Insertable(new PasswordLib()
|
||||
{
|
||||
PLID = IdGeneratorUtility.NextId(),
|
||||
IsDeleted = false,
|
||||
plAccountName = "aaa",
|
||||
plCreateTime = DateTime.Now
|
||||
}).ExecuteReturnSnowflakeIdAsync();
|
||||
|
||||
db.BeginTran();
|
||||
Console.WriteLine(db.ContextID);
|
||||
await db.Insertable(new PasswordLib()
|
||||
{
|
||||
PLID = IdGeneratorUtility.NextId(),
|
||||
IsDeleted = false,
|
||||
plAccountName = "aaa",
|
||||
plCreateTime = DateTime.Now
|
||||
}).ExecuteReturnSnowflakeIdAsync();
|
||||
|
||||
db.CommitTran();
|
||||
|
||||
Console.WriteLine(db.ContextID);
|
||||
db.CommitTran();
|
||||
Console.WriteLine("完成");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
db.RollbackTran();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 但是调用其他类方法 上下文ContextID就不一样
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
var executeLog = await ExecuteJob(context, async () => await Run(context));
|
||||
}
|
||||
|
||||
public async Task Run(IJobExecutionContext context)
|
||||
{
|
||||
System.Console.WriteLine($"Job_Blogs_Quartz 执行 {DateTime.Now.ToShortTimeString()}");
|
||||
var list = await _blogArticleServices.Query();
|
||||
// 也可以通过数据库配置,获取传递过来的参数
|
||||
JobDataMap data = context.JobDetail.JobDataMap;
|
||||
//int jobId = data.GetInt("JobParam");
|
||||
|
||||
await _guestbookServices.TestTranPropagationTran2();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
DouyinApi.Tasks/QuartzNet/Jobs/Job_OperateLog_Quartz.cs
Normal file
83
DouyinApi.Tasks/QuartzNet/Jobs/Job_OperateLog_Quartz.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using DouyinApi.Common.LogHelper;
|
||||
using DouyinApi.IServices;
|
||||
using DouyinApi.Model.Models;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
/// <summary>
|
||||
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到
|
||||
/// </summary>
|
||||
namespace DouyinApi.Tasks
|
||||
{
|
||||
public class Job_OperateLog_Quartz : JobBase, IJob
|
||||
{
|
||||
private readonly IOperateLogServices _operateLogServices;
|
||||
private readonly IWebHostEnvironment _environment;
|
||||
|
||||
public Job_OperateLog_Quartz(IOperateLogServices operateLogServices, IWebHostEnvironment environment, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices)
|
||||
: base(tasksQzServices, tasksLogServices)
|
||||
{
|
||||
_operateLogServices = operateLogServices;
|
||||
_environment = environment;
|
||||
}
|
||||
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
var executeLog = await ExecuteJob(context, async () => await Run(context));
|
||||
}
|
||||
|
||||
public async Task Run(IJobExecutionContext context)
|
||||
{
|
||||
|
||||
// 可以直接获取 JobDetail 的值
|
||||
var jobKey = context.JobDetail.Key;
|
||||
var jobId = jobKey.Name;
|
||||
// 也可以通过数据库配置,获取传递过来的参数
|
||||
JobDataMap data = context.JobDetail.JobDataMap;
|
||||
|
||||
List<LogInfo> excLogs = new List<LogInfo>();
|
||||
var exclogContent = LogLock.ReadLog(Path.Combine(_environment.ContentRootPath, "Log"), $"GlobalExceptionLogs_{DateTime.Now.ToString("yyyMMdd")}.log", Encoding.UTF8);
|
||||
|
||||
if (!string.IsNullOrEmpty(exclogContent))
|
||||
{
|
||||
excLogs = exclogContent.Split("--------------------------------")
|
||||
.Where(d => !string.IsNullOrEmpty(d) && d != "\n" && d != "\r\n")
|
||||
.Select(d => new LogInfo
|
||||
{
|
||||
Datetime = (d.Split("|")[0]).Split(',')[0].ObjToDate(),
|
||||
Content = d.Split("|")[1]?.Replace("\r\n", "<br>"),
|
||||
LogColor = "EXC",
|
||||
Import = 9,
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
var filterDatetime = DateTime.Now.AddHours(-1);
|
||||
excLogs = excLogs.Where(d => d.Datetime >= filterDatetime).ToList();
|
||||
|
||||
var operateLogs = new List<OperateLog>() { };
|
||||
excLogs.ForEach(m =>
|
||||
{
|
||||
operateLogs.Add(new OperateLog()
|
||||
{
|
||||
LogTime = m.Datetime,
|
||||
Description = m.Content,
|
||||
IPAddress = m.IP,
|
||||
UserId = 0,
|
||||
IsDeleted = false,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
if (operateLogs.Count > 0)
|
||||
{
|
||||
var logsIds = await _operateLogServices.Add(operateLogs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
47
DouyinApi.Tasks/QuartzNet/Jobs/Job_URL_Quartz.cs
Normal file
47
DouyinApi.Tasks/QuartzNet/Jobs/Job_URL_Quartz.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using DouyinApi.Common.Helper;
|
||||
using DouyinApi.IServices;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Quartz;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
/// <summary>
|
||||
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到(任务类要去JobSetup添加注入)
|
||||
/// </summary>
|
||||
namespace DouyinApi.Tasks
|
||||
{
|
||||
public class Job_URL_Quartz : JobBase, IJob
|
||||
{
|
||||
private readonly ILogger<Job_URL_Quartz> _logger;
|
||||
|
||||
public Job_URL_Quartz(ILogger<Job_URL_Quartz> logger, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices)
|
||||
: base(tasksQzServices, tasksLogServices)
|
||||
{
|
||||
_tasksQzServices = tasksQzServices;
|
||||
_logger = logger;
|
||||
}
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
// 可以直接获取 JobDetail 的值
|
||||
var jobKey = context.JobDetail.Key;
|
||||
var jobId = jobKey.Name;
|
||||
var executeLog = await ExecuteJob(context, async () => await Run(context, jobId.ObjToInt()));
|
||||
|
||||
}
|
||||
public async Task Run(IJobExecutionContext context, int jobid)
|
||||
{
|
||||
if (jobid > 0)
|
||||
{
|
||||
JobDataMap data = context.JobDetail.JobDataMap;
|
||||
string pars = data.GetString("JobParam");
|
||||
if (!string.IsNullOrWhiteSpace(pars))
|
||||
{
|
||||
var log = await HttpHelper.GetAsync(pars);
|
||||
_logger.LogInformation(log);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user