我正在.NET Core
“工人服务”项目中为Windows和Linux OS实施服务。
服务从外部config.xml
文件读取数据,例如凭据/ URL。我也想在配置文件中添加间隔时间,以便将来如果我想要更改间隔时间(例如,每小时到每2小时),我将只更新配置文件,而无需修改和重新编译代码。
我正在使用Coraval库进行调度。用interval
方法设置Main
时间。我的疑问是何时更改配置文件中的interval
时间(正在Main
方法中读取),如何将其分配给进一步执行?对于Windows
和Linux
。
Main
方法多久被调用一次,以便它从配置文件中读取新的调度时间?
这是我的代码
public static void Main(string[] args)
{
var schedulingConfig = GlobalSettings.ReadIntervals(out List<intervalValue> intervalvalues);
string intrvaltype = string.Empty;
foreach (var item in schedulingConfig)
{
if (item.Name == "true")
{
intrvaltype = item.Execution;
break;
}
}
IHost host = CreateHostBuilder(args).Build();
host.Services.UseScheduler(scheduler =>
{
//Remind schedular to repeat the same job
switch (intrvaltype)
{
case "isSignleHourInADay":
scheduler
.Schedule<ReprocessInvocable>()
.Hourly();
break;
case "isMinutes":
scheduler
.Schedule<ReprocessInvocable>()
.EveryFiveMinutes();
break;
case "isOnceInADay":
scheduler
.Schedule<ReprocessInvocable>()
.Daily();
break;
case "isSecond":
scheduler
.Schedule<ReprocessInvocable>()
.EveryThirtySeconds();
break;
}
});
host.Run();
}
我应该将代码保存在哪里,以便它可以处理需要的工作?
正如我在Coravel中看到的那样,它具有When
方法可能是您的解决方案:
首先定义一个方法,该方法根据您的配置说明哪个Interval有效运行:
static Task<bool> IsRun(TimeSpan timeSpan)
{
return Task.Run(() =>
{
GlobalSettings.ReadIntervals(out List<double> intervalMilliseconds);
// I assumed that intervalMilliseconds is your valid intervals in milliseconds
return intervalMilliseconds.Contains(timeSpan.TotalMilliseconds);
});
}
然后以这种方式将When
添加到您的Invocables:
host.Services.UseScheduler(scheduler =>
{
scheduler
.Schedule<ReprocessInvocable>()
.Hourly()
.When(() => IsRun(new TimeSpan(1, 0, 0)));
scheduler
.Schedule<ReprocessInvocable>()
.EveryFiveMinutes()
.When(() => IsRun(new TimeSpan(0, 5, 0)));
scheduler
.Schedule<ReprocessInvocable>()
.Daily()
.When(() => IsRun(new TimeSpan(24, 0, 0)));
scheduler
.Schedule<ReprocessInvocable>()
.EveryThirtySeconds()
.When(() => IsRun(new TimeSpan(0, 0, 30)));
});