作业内部的异常,不要影响应用启动

This commit is contained in:
大石头 2024-07-08 18:20:42 +08:00
parent bddbae99b9
commit 05c7e7c0b4
4 changed files with 46 additions and 10 deletions

View File

@ -27,7 +27,7 @@ scheduler.AddHandler<SqlHandler>();
scheduler.AddHandler<SqlMessage>();
// 启动调度引擎,调度器内部多线程处理
scheduler.Start();
scheduler.StartAsync();
// 友好退出
var host = services.BuildHost();

View File

@ -80,7 +80,14 @@ public class NetworkJobProvider(AntSetting setting) : JobProvider
list.Add(job);
}
if (list.Count > 0) Ant.AddJobs(list.ToArray());
if (list.Count > 0)
{
WriteLog("注册作业[{0}]{1}", list.Count, list.Join(",", e => e.Name));
var rs = Ant.AddJobs(list.ToArray());
WriteLog("注册成功[{0}]{1}", rs?.Length, rs.Join());
}
// 通信完成,改回来本地时间
foreach (var handler in bs)

View File

@ -159,8 +159,8 @@ public class Scheduler : DisposeBase
prv.Start();
// 获取本应用在调度中心管理的所有作业
var jobs = prv.GetJobs();
if (jobs == null || jobs.Length == 0) throw new Exception("调度中心没有可用作业");
var jobs = prv.GetJobs() ?? [];
//if (jobs == null || jobs.Length == 0) throw new Exception("调度中心没有可用作业");
// 输出日志
WriteLog($"启动任务调度引擎[{prv}],作业[{hs.Count}]项,定时{Period}秒");
@ -173,12 +173,22 @@ public class Scheduler : DisposeBase
// 查找作业参数,分配给处理器
var job = jobs.FirstOrDefault(e => e.Name == handler.Name);
if (job == null || !job.Enable) continue;
if (job != null && job.Mode == 0) job.Mode = handler.Mode;
handler.Job = job;
handler.Tracer = Tracer;
handler.Log = Log;
handler.Start();
try
{
handler.Start();
}
catch (Exception ex)
{
Log?.Error("作业[{0}]启动失败!{1}", handler.GetType().FullName, ex.Message);
}
}
// 定时执行
@ -197,7 +207,14 @@ public class Scheduler : DisposeBase
foreach (var handler in Handlers)
{
handler.Stop("SchedulerStop");
try
{
handler.Stop("SchedulerStop");
}
catch (Exception ex)
{
Log?.Error("作业[{0}]停止失败!{1}", handler.GetType().FullName, ex.Message);
}
}
}
@ -236,7 +253,17 @@ public class Scheduler : DisposeBase
// 更新作业参数,并启动处理器
handler.Job = job;
if (job.Mode == 0) job.Mode = handler.Mode;
if (!handler.Active) handler.Start();
if (!handler.Active)
{
try
{
handler.Start();
}
catch (Exception ex)
{
Log?.Error("作业[{0}]启动失败!{1}", handler.GetType().FullName, ex.Message);
}
}
// 如果正在处理任务数没达到最大并行度,则继续安排任务
var max = job.MaxTask;
@ -300,7 +327,8 @@ public class Scheduler : DisposeBase
handler.Schedule = this;
handler.Provider = provider;
if (handler is MessageHandler messageHandler && !job.Topic.IsNullOrEmpty()) messageHandler.Topic = job.Topic;
if (handler is MessageHandler messageHandler && !job.Topic.IsNullOrEmpty())
messageHandler.Topic = job.Topic;
handler.Log = Log;
handler.Tracer = Tracer;
@ -313,7 +341,8 @@ public class Scheduler : DisposeBase
catch (Exception ex)
{
span?.SetError(ex, null);
XTrace.WriteException(ex);
//XTrace.WriteException(ex);
Log?.Error("作业[{0}]启动失败!{1}", handler?.GetType().FullName, ex.Message);
}
}
}

View File

@ -37,7 +37,7 @@ public class JobHost : BackgroundService
scheduler.AddHandler<BuildWill>();
// 启动调度引擎,调度器内部多线程处理
scheduler.Start();
scheduler.StartAsync();
_scheduler = scheduler;
return Task.CompletedTask;