我正在尝试在 ASP.Net Core 1.1 中的 Web 应用程序上实现 cron 任务。
我决定选择Hangfire https://www.hangfire.io/图书馆。
为了检查我的安装和配置是否正常工作,我刚刚编写了一个非常简单的重复作业,旨在在控制台输出上打印当前的日期时间:
RecurringJob.AddOrUpdate(() => Console.WriteLine($"{DateTime.Now}"), Cron.Minutely);
奇怪的是,每一分钟,它都会打印相同的消息,对应于第一次打印消息的日期和时间,并且不更新DateTime.Now
part.
如果我访问 /Hangfire 仪表板并查看作业详细信息,它会显示为静态日期时间输出,如下所示:
Console.WriteLine("15/09/2017 15:27:21");
因此,这项工作在排队时似乎是“编译”的,这显然不是我想要做的。
我尝试用对数据库表上的行进行计数的作业来替换此作业。问题是相同的:如果我在作业的两次出现之间添加或删除行,则显示的行计数不会更新。仅当我重新启动 Web 应用程序时才会发生更新。
所以你的问题是 Hangfire 使用 NewtonSoft 序列化你发送到作业的参数。当您的程序将作业排队时,它会获取当前时间,然后用该时间调用该函数。
尝试将函数移至方法调用中。所以而不是
RecurringJob.AddOrUpdate(() => Console.WriteLine($"{DateTime.Now}"), Cron.Minutely);
Try
RecurringJob.AddOrUpdate(() => PrintTime(), Cron.Minutely);
...
private static void PrintTime() {
Console.WriteLine($"{DateTime.Now}");
}
如果我对 Hangfire 的理解是正确的,这只会序列化要调用的方法的名称,但不会序列化时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)