c# - 使用hangfire在分布式环境中每天发送电子邮件

标签 c# .net distributed hangfire

我是 Hangfire 的新手,我想知道使用该工具是否可以实现这一目标:

我必须每天向 SQL 数据库中的人员列表发送电子邮件。问题是我的网络应用程序(尽管它只使用一个数据库)是通过 Amazon 部署的,负载均衡器可能会添加服务器(如果需要)。

我希望hangfire 任务每天只执行一次。

我的第一个想法是使用 Hangfire 在我的 Application_Start 方法上注册循环任务,但这行不通,对吗? 如何注册我的循环任务,即使我有多个服务器正在运行,该任务也只执行一次?我在其他帖子中读到,我可以对数据库做一些技巧:有一个“表”来注册任务是否已经执行,但我认为如果我必须这样做,这种解决方案将无法扩展,每天需要完成 10 个任务。

我想到的另一种方法是为hangfire执行创建一个单独的“应用程序”,仅部署在一台服务器中。由于我的网络应用程序使用 dll 来访问数据库,因此我可以对这个新的“应用程序”执行相同的操作,并使用相同的 dll 授予对数据库的访问权限,但每次更改时我都必须更新我的应用程序dll。

任何想法将不胜感激。谢谢!

最佳答案

让多个“任务”服务器运行 Hangfire 没有问题。它就是为此而设计的。

Hangfire.RecurringJob.AddOrUpdate<YourJobClass>(YourEmailJobID, x => x.YourMethodCall(anyParameter), Cron.Daily);

查看 Cron 对象以获取更多选项。只需确保您对 YourEmailJobID 使用相同的 ID,它就会按您的预期工作。您可以从一百个不同的服务器调用该方法一百次,只要传入相同的参数,Hangfire DB 中的作业条目就不会改变。

此外,如果您有并发作业正在运行,但只希望其中一台任务服务器同时执行该作业,请在 Hangfire 方法上使用此属性。

    [Hangfire.DisableConcurrentExecution(60)]
    public void YourMethodCall(object anyParameter)
    {
         ....
    }

关于c# - 使用hangfire在分布式环境中每天发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39706075/

相关文章:

.net - 是否有 .net 框架可以帮助解决这种情况?

scala - 在集群上分发 Scala?

c# - 使用 Irony 实现前缀表示法表达式解析器

c# - 从 Selenium webdriver 的当前窗口 GUID 获取窗口句柄 (IntPtr)

c# - 如何在 C# 中找到对象的所属程序集

mysql - 分布式数据库的最佳设计

c# - Sitecore - 在 C# 中设置控件顺序

c# - 桌面复制API捕获特定窗口

javascript - Web服务和网站在同一个项目中

.net - 如何使用 Click Once 构建单实例应用程序?