//每一个应用实例就是一个App
public class App
{
public int ID {get;set;}
publi string DisplayName {get;set;}
public string Secret {get;set;}
}
//描述App的工作状态
public class AppOnline
{
public int ID {get;set;}
public string Instantce {get;set;}
public string Client {get;set;}
public string Name {get;set;}
public int ProcessId {get;set;}
public string Version {get;set;}
public string Server {get;set;}
public int Tasks {get;set;}
public int Total {get;set;}
}
//作业
public class Job
{
public int ID {get;set;}
public int AppID {get;set;}
public string Name {get;set;}
public string ClassName {get;set;}
public string DisplayName {get;set;}
public int Mode {get;set;}
public string Topic {get;set;}
public int MessageCount {get;set;}
public DateTime Start {get;set;}
public DateTime End {get;set;}
public int Step {get;set;}
public int BatchSize {get;set;}
public int Offset {get;set;}
}
//作业的任务
public class JobTask
{
public int ID {get;set;}
public int AppID {get;set;}
public int JobID {get;set;}
}
应用要做的事情是把作业交给调度器开始执行。
var set = AntSetting.Current;
// 实例化调度器
var sc = new Scheduler();
// 使用分布式调度引擎替换默认的本地文件调度
sc.Provider = new NetworkJobProvider
{
Server = set.Server,
AppID = set.AppID,
Secret = set.Secret,
};
// 添加作业处理器
sc.Handlers.Add(new HelloJob());
sc.Handlers.Add(new BuildPatient());
sc.Handlers.Add(new BuildWill());
// 启动调度引擎,调度器内部多线程处理
sc.Start();
所有的作业都是Handler
类型。
[DisplayName("定时欢迎")]
[Description("简单的定时任务")]
internal class HelloJob : Handler
{
public HelloJob()
{
// 今天零点开始,每10秒一次
var job = Job;
job.Start = DateTime.Today;
job.Step = 10;
}
protected override Int32 Execute(JobContext ctx)
{
// 当前任务时间
var time = ctx.Task.Start;
WriteLog("新生命蚂蚁调度系统!当前任务时间:{0}", time);
// 成功处理数据量
return 1;
}
}
Scheduler.Start()
做了什么?public class Scheduler
{
public List<Handler> Handlers { get; } = new List<Handler>();
public IJobProvider Provider { get; set; }//作业提供者
public void Start()
{
var prv = Provider;
prv.Schedule = this;
prv.Start();//作业提供者开始
var jobs = prv.GetJobs();
var hs = Handlers;
foreach (var handler in hs)
{
handler.Schedule = this;
handler.Provider = prv;
var job = jobs.FirstOrDefault(e => e.Name == handler.Name);
if(job!=null && job.Mode ==0) job.Mode = handler.Mode;
handler.Job = job;
handler.Start();//作业处理器开始
}
if(Period > 0) _timer = new TimeX(Loop, null, Period * 1000, "Job"){Async = true};
}
}
Scheduler
中维护着Handler
的集合以及IJobProvider
。IJobProvider
需要知道Scheduler
。Handler
需要知道Scheduler
和IJobProvider
以及IJob
。Scheduler
让IJobProvider
和每个Handler
开始工作。更加重要的是,在实例化TimeX
的过程中开始了任务调度,即Scheudler
中的Process()
。
Pr