Hangfire 重复作业未在 IIS 上及时运行

问题描述 投票:0回答:2

我在 IIS 上有一个 Web 服务,可以执行以下操作:

  1. 我有 2 份经常性工作,在内部创造了大约 800 个工作岗位。重复性作业应该在午夜运行。
  2. Hangrire 在后台使用 MSSQL。

我预计重复作业会在午夜运行。 但是,当我第二天登录到hangfire仪表板时,重复的工作就在那时开始了(而不是在午夜)。

我想知道这个问题是否是因为我在应用程序池刷新后对hangfire请求的请求归因于此行为。

iis jobs hangfire recurring
2个回答
3
投票

你试过这个吗?

正如 Hangfire 文档中所说:

默认情况下,Web 应用程序中的 Hangfire Server 实例不会 直到第一个用户访问您的网站为止。更何况还有一些 一段时间后会让你的网络应用程序崩溃的事件(我是 谈论空闲超时和不同的应用程序池回收事件)。 在这些情况下,您的重复任务和延迟工作将不会被 已排队,排队的作业将不会被处理。

另外,完成后不要忘记运行

iisreset
,因为新的配置需要由 IIS 服务器加载。


0
投票

默认情况下,IIS 将在 20 分钟不活动(空闲超时设置)后使应用程序空闲。如果没有请求保持应用程序处于活动状态,它将停止,包括任何后台任务,例如 Hangfire 作业。为了防止这种情况,您可以:

  • 在应用程序池设置中将空闲超时(分钟)设置为 0 以保持池处于活动状态。
  • 使用应用程序初始化等服务定期 ping Web 应用程序以使其保持活动状态。

您可能希望通过在应用程序池的 applicationHost.config 中将 startMode 设置为 AlwaysRunning 来启用 IIS 中的始终运行模式: xml

<applicationPools>
    <add name="YourAppPoolName" startMode="AlwaysRunning" />
</applicationPools>

enter image description here

此外,您还可以创建 Windows 任务计划程序来运行 PowerShell 脚本,定期对您的 Web 应用程序执行 ping 操作。

# Replace the URL with your site URL
$url = "http://yoursite.com.au"
$request = [System.Net.WebRequest]::Create($url)
$request.Timeout = 5000  # Timeout in milliseconds (5 seconds)
try {
    $response = $request.GetResponse()
    Write-Output "Ping successful at $(Get-Date)"
}
catch {
    Write-Output "Ping failed at $(Get-Date): $_"
}

使用 .ps1 扩展名保存脚本,例如 PingApp.ps1。使用 Windows 任务计划程序将脚本安排为右侧面板中的“创建基本”任务。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.