【问题标题】:For Hangfire, is there any sample code for non-simple tasks; and how should recurring tasks be handled when re-publishing?对于 Hangfire,是否有任何非简单任务的示例代码;重新发布时应如何处理重复性任务?
【发布时间】:2020-01-29 20:53:43
【问题描述】:

我正在考虑使用 Hangfire https://www.hangfire.io 来替换旧的本土调度 ASP.NET 网站/应用程序。

我使用 Hangfire 创建了一个简单的测试项目。我可以使用 Hangfire 启动项目,提交(在代码中)几个非常简单的单个重复任务,查看仪表板等。

我正在寻找更多建议,以便为要安排的任务创建更复杂的代码(和类),并且我有一个问题,即在将 Hangfire 网站重新发布到生产环境时,永久安排的任务会发生什么。

我已经阅读了 Hangfire 网站上的一些文档,查看了 2 个教程,浏览了 Hangfire 论坛,并在 StackOverflow 和网络上进行了一些搜索。我所看到的很多内容都向您展示了如何安排一些非常简单的事情(例如 Console.WriteLine),但没有更复杂的事情。 “Highlighter”教程很有用,但它本质上展示了如何安排一个(运行时间稍长的)任务的单个实例来响应交互式用户输入。我知道这有多么有用,但我对提交然后每天(或每小时等)运行并且不需要再次提交的重复任务更感兴趣。这些任务可能是诸如每晚向用户发送一批电子邮件、批量处理一些数据、导入外部数据的夜间提要、定期调用 Web 服务以执行一些处理等。

是否有任何可用的示例代码显示此类示例,或任何有关在接口和类中构建此类代码的最合适方法的指导?

其次,就我而言,大多数任务都是“永久性的”(始终作为重复任务存在)。如果我在生产中启动 Hangfire 应用程序后不久设置代码以将这些添加为重复任务,那么在将更新发布到生产时我应该如何处理它(当相同的初始化将再次运行时)?我应该用相同的 ID 调用“AddOrUpdate”,Hangfire 会处理它吗?我应该先调用“RemoveIfExists”然后再次添加重复任务吗?是否应该使用其他方法?

【问题讨论】:

  • 我不明白你为什么想要这个示例代码。如果您在运行复杂任务时遇到问题,请创建minimal reproducible example 并在此处发布。 Stack Overflow 不是在这里为您找到示例代码。至于您的其他问题 - 您可以自己尝试以了解如何产生您想要的行为。

标签: asp.net hangfire


【解决方案1】:

一个例子是日志管理员,它会在每个工作日@下午 5:00 运行以删除超过 5 天的日志。

public void Schedule()
{
    RecurringJob.AddOrUpdate<LogJanitor>(
        "Janitor - Old Logs", 
        j => j.OnSchedule(null),
        "0 17 * * 1,2,3,4,5", 
        TimeZoneInfo.FindSystemTimeZoneById("CST"));
}

那我们就这样处理

public void OnSchedule(
    PerformContext context)
{
    DateTime timeStamp = DateTime.Today.AddDays(-5);
    _logRepo.FindAndDelete(from: DateTime.MinValue, to: timeStamp);
}

这两个方法在LogJanitor 类中声明。当我们的应用程序启动时,我们会得到这个类的一个实例,然后调用Schedule()

【讨论】:

  • herme 0:谢谢 - 这对我开始在项目中设置一些计划任务很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2013-01-07
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多