ASP.Net Core 中的 Hangfire:简单的重复作业不会刷新其动态内容

Hangfire in ASP.Net Core : simple recurring job does not refresh its dynamic content

我正在尝试在 ASP.Net Core 1.1 中的 Web 应用程序上实施 cron 任务。

我决定选择 Hangfire 库。

为了检查我的安装和配置是否工作正常,我只是写了一个非常简单的循环作业,目的是在控制台输出上打印当前日期时间:

RecurringJob.AddOrUpdate(() => Console.WriteLine($"{DateTime.Now}"), Cron.Minutely);

奇怪的是,每分钟,它打印相同的消息,对应于第一次打印消息的日期和时间,而不是更新DateTime.Now部分。

如果我访问 /Hangfire 仪表板并查看作业详细信息,它似乎已翻译为静态日期时间输出,因此:

Console.WriteLine("15/09/2017 15:27:21");

所以工作在排队时似乎有点 'compiled',这显然不是我想要做的。

我试图用计算数据库行数的作业替换此作业 table。问题是一样的:如果我在作业的两次出现之间添加或删除行,则显示的行数不会更新。仅当我重新启动 Web 应用程序时才会更新。

所以你的问题是 Hangfire 使用 NewtonSoft 序列化你发送给作业的参数。当您的程序将作业排入队列时,它会获取当前时间,然后使用该时间调用该函数。

尝试将函数移动到方法调用中。所以而不是

RecurringJob.AddOrUpdate(() => Console.WriteLine($"{DateTime.Now}"), Cron.Minutely);  

尝试

RecurringJob.AddOrUpdate(() => PrintTime(), Cron.Minutely); 
...
private static void PrintTime() {
    Console.WriteLine($"{DateTime.Now}");
}

如果我对Hangfire的理解是正确的,这个只会序列化调用的方法名,不会序列化时间。

对于我的问题中描述的问题,Stephen Vernyi 发现了问题:由于 Hangfire 序列化 JSON 中的参数,第一个日期时间在序列化时被冻结,因此每次后续执行都会提供相同的输出。

但是按照他的建议,写方法的时候一定要小心。

因为我只是随便尝试让这一切正常工作,所以我所有的测试都是用静态方法写在静态 class 中的。并且这样的实施提供了相同的冻结日期时间问题!

当我决定重构我的实现时,在默认 ASP.Net 核心 IoC 容器中注册作业服务,并设置为在每次请求时提供新的服务实例,它不仅解决了冻结输出问题,还有依赖注入遇到的每个问题。