using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using MegaRobo.Contract;
namespace MegaRobo.RRQuartz
{
public abstract class JobItemBase
{
private string _name;
public JobItemBase()
{
}
public JobItemBase(JobItemBase jobItemBase)
{
this.Name = jobItemBase.Name;
this.GroupName = jobItemBase.GroupName;
this.RunFailedWithJobName = jobItemBase.RunFailedWithJobName;
this.RunSuccessWithJobName = jobItemBase.RunSuccessWithJobName;
this.TryCount = jobItemBase.TryCount;
this.Descr = jobItemBase.Descr;
this.Title = jobItemBase.Title;
this.TargetService = jobItemBase.TargetService;
this.CanExecute = jobItemBase.CanExecute;
this.Data = jobItemBase.Data;
this.Timeout = jobItemBase.Timeout;
this.Guid = System.Guid.NewGuid().ToString("N");
}
public JobItemBase(string name, string title, IConnection targetService, string descr = null, [CallerFilePath] string sourceFilePath = "", [CallerMemberName] string memberName = "", [CallerLineNumber] int sourceLineNumber = 0)
{
this.Name = name;
this.Title = title;
this.TargetService = targetService;
this.Descr = descr;
this.ExecCount = 0;
this.Sender = @$"member:{memberName}\line:{sourceLineNumber}\sender:{Path.GetFileName(sourceFilePath)}";
this.Guid = System.Guid.NewGuid().ToString("N");
}
public JobItemBase(string name, string title, IConnection targetService, TimeSpan timeout, string descr = null, [CallerFilePath] string sourceFilePath = "", [CallerMemberName] string memberName = "", [CallerLineNumber] int sourceLineNumber = 0)
: this(name, title, targetService, descr, sourceFilePath, memberName, sourceLineNumber)
{
this.Timeout = timeout;
}
public IConnection TargetService { get; protected set; }
public string Sender { get; }
public string GroupName { get; set; }
public object Data { get; set; }
public JobStatus Status { get; protected set; } = JobStatus.None;
public Stopwatch UsedTime { get; set; } = new();
public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(5);
public int ExecCount { get; set; } = 0;
public string RunSuccessWithJobName { get; set; }
public string RunFailedWithJobName { get; set; }
///
/// 重试次数. -1:循环
///
public int TryCount { get; set; } = 3;
public string Name
{
get => this._name?.ToLower();
protected set => this._name = value;
}
public string Title { get; set; }
public string Guid { get; }
public string Descr { get; set; }
///
/// 剩余时间
///
public double RemainderTime => Math.Max(0, (this.Timeout - this.UsedTime.Elapsed).TotalSeconds);
public DateTime Crtime { get; protected set; } = DateTime.Now;
public Func CanExecute { get; set; }
public abstract void Restart();
public abstract Task OnExecuteActionAsync();
public void Stop()
{
this.UsedTime.Stop();
}
public void SetStatus(JobStatus status)
{
this.Status = status;
}
///
///
///
/// 超时时间
/// 0-替换,1-追加
public void SetTimeout(TimeSpan timeOut, int mode)
{
this.Timeout = mode == 0 ? timeOut : this.Timeout.Add(timeOut);
}
public bool CheckTimeout() => this.UsedTime.Elapsed > this.Timeout;
}
public abstract class JobItemBase : JobItemBase where TMode : Enum
{
public JobItemBase(TMode mode, string name, string title, IConnection targetService, TimeSpan timeout, string descr = null) : base(name, title, targetService, timeout, descr)
{
this.Mode = mode;
}
public TMode Mode { get; }
}
public enum JobStatus
{
None = 1,
HasSend = 2,
Ack = 11,
RunFailed = 21,
RunSuccess = 22
}
}