157 lines
5.2 KiB
C#
157 lines
5.2 KiB
C#
|
|
using Microsoft.Practices.Unity;
|
|||
|
|
using MyCode.Project.Domain.Message.Response.Queue;
|
|||
|
|
using MyCode.Project.Infrastructure.Cache;
|
|||
|
|
using MyCode.Project.Infrastructure.Common;
|
|||
|
|
using MyCode.Project.Infrastructure.Constant;
|
|||
|
|
using MyCode.Project.Infrastructure.Extensions;
|
|||
|
|
using MyCode.Project.Infrastructure.UnityExtensions;
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
|
|||
|
|
namespace MyCode.Project.Services.Implementation
|
|||
|
|
{
|
|||
|
|
public class QueueProcessService:ServiceBase, IQueueProcessService
|
|||
|
|
{
|
|||
|
|
#region 初始化
|
|||
|
|
private readonly IMyCodeCacheService _myCodeCacheService;
|
|||
|
|
|
|||
|
|
public QueueProcessService(IMyCodeCacheService myCodeCacheService)
|
|||
|
|
{
|
|||
|
|
_myCodeCacheService = myCodeCacheService;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region AddQueue(添加队列)
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 添加队列
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="methodName">方法名</param>
|
|||
|
|
/// <param name="entity">参数信息</param>
|
|||
|
|
public void AddQueue<T>(string methodName, DateTime? expireTime, object entity = null)
|
|||
|
|
{
|
|||
|
|
AddQueue(typeof(T), methodName, expireTime, entity);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region AddQueue(添加队列)
|
|||
|
|
/// <summary>
|
|||
|
|
/// 添加队列
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="type">执行类</param>
|
|||
|
|
/// <param name="methodName">方法名</param>
|
|||
|
|
/// <param name="entity">参数信息</param>
|
|||
|
|
public void AddQueue(Type type, string methodName, DateTime? expireTime, object entity = null)
|
|||
|
|
{
|
|||
|
|
string typePath = string.Format("{0}, {1}", type.FullName, type.Assembly.GetName().Name);
|
|||
|
|
string paramInfo = entity == null
|
|||
|
|
? ""
|
|||
|
|
: entity is string || entity is Guid || entity is int || entity is long || entity is decimal ||
|
|||
|
|
entity is float || entity is double
|
|||
|
|
? entity.ToString()
|
|||
|
|
: JsonConvert.SerializeObject(entity);
|
|||
|
|
AddQueue(typePath, methodName, expireTime, paramInfo);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region AddQueue(添加队列)
|
|||
|
|
/// <summary>
|
|||
|
|
/// 添加调度任务
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="typePath">类型路径,如:Lxm.IServices.IWorkProcessService, Lxm.Services</param>
|
|||
|
|
/// <param name="methodName">方法名</param>
|
|||
|
|
/// <param name="paramInfo">参数信息</param>
|
|||
|
|
public void AddQueue(string typePath, string methodName, DateTime? expireTime, string paramInfo = "")
|
|||
|
|
{
|
|||
|
|
var model = new QueueProcess()
|
|||
|
|
{
|
|||
|
|
MethodName = methodName,
|
|||
|
|
Parameter = paramInfo,
|
|||
|
|
TypePath = typePath,
|
|||
|
|
CreateTime = DateTime.Now,
|
|||
|
|
ExpireTime = expireTime
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//这里判断下,队列中是否已经存在
|
|||
|
|
_myCodeCacheService.Push(CacheKey.LxmQueueCacheKey, model);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region GetLen(返回队列长度)
|
|||
|
|
/// <summary>
|
|||
|
|
/// 返回队列长度
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public long GetLen()
|
|||
|
|
{
|
|||
|
|
return _myCodeCacheService.ListLen(CacheKey.LxmQueueCacheKey);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Execute(调度执行,普通调度)
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 涉及到资源释放问题,每次开启一个线程去执行
|
|||
|
|
/// </summary>
|
|||
|
|
public void Execute()
|
|||
|
|
{
|
|||
|
|
var queueLen = _myCodeCacheService.ListLen(CacheKey.LxmQueueCacheKey);
|
|||
|
|
|
|||
|
|
Console.WriteLine($"目前队列长度:{queueLen}");
|
|||
|
|
|
|||
|
|
var objProcess = _myCodeCacheService.Popup(CacheKey.LxmQueueCacheKey);
|
|||
|
|
|
|||
|
|
if (objProcess == null) { return; }
|
|||
|
|
|
|||
|
|
var process = (QueueProcess)objProcess;
|
|||
|
|
|
|||
|
|
if (process.ExpireTime != null && DateTime.Now > process.ExpireTime)
|
|||
|
|
{
|
|||
|
|
var error = $"过期不进行,{process.ToJson()}";
|
|||
|
|
|
|||
|
|
LogHelper.Error(error);
|
|||
|
|
|
|||
|
|
//如果需要执行的调度过期了,则跳过继续执行
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//这里对AOP的事务或者缓存也会生效
|
|||
|
|
var type = UnityHelper.GetUnityContainer().Resolve(Type.GetType(process.TypePath));
|
|||
|
|
|
|||
|
|
Console.WriteLine($"执行方法:{process.TypePath}.{process.MethodName}");
|
|||
|
|
|
|||
|
|
Console.WriteLine($"参数:{process.Parameter}");
|
|||
|
|
|
|||
|
|
MethodInfo method = type.GetType().GetMethod(process.MethodName);
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(process.Parameter))
|
|||
|
|
{
|
|||
|
|
method.Invoke(type, new object[] { process.Parameter });
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
method.Invoke(type, new object[] { });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
LogHelper.Error($"执行方法:{process.TypePath}.{process.MethodName},传参:{process.Parameter}");
|
|||
|
|
LogHelper.Error(ex);
|
|||
|
|
|
|||
|
|
DingDingHelper.SendMsg($"调度QueueProcess异常:{ex}");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|