【发布时间】:2016-03-24 06:46:23
【问题描述】:
我计划创建一个 asp.net mvc web 应用程序,它将执行单个同步作业,以实现此目的:-
我们有一个第 3 方 ERP 系统,它会及时生成一个 .csv 文件,每小时会生成一个
.csv文件。.csv文件包含有关我们公司资产的信息,例如类型、价格、名称、位置等……现在我将开发一个 asp.net mvc Web 应用程序,它将读取
.csv数据并使用此数据更新数据库。
所以我打算做以下事情:-
我将创建一个包含数据的新数据库。
我将创建一个新的 asp.net mvc-5 Web 应用程序,它有一个 SYNC 操作方法,它将读取
.csv数据,并更新数据库。
现在我面临的问题是我需要每小时或按特定时间表运行同步作业。现在根据我以前的经验,我可以列出这两种及时调用动作方法的方法:-
在 asp.net mvc 的 global.asax 中,我可以创建一个每小时运行的计划。
我可以使用 Hangfire 等第三方工具来安排任务。
现在使用这些方法中的任何一种都会导致这种限制:-
- global.asax 或第三方工具如 Hangfire 将在应用程序池下运行,如果没有对应用程序执行任何操作,则调度将永远不会运行,因为应用程序池将不会处于活动状态。但在我之前的应用程序中,这并不是一个真正的问题,因为系统在计划作业旁边包含许多视图,因此系统在工作时间内几乎 100% 保持活跃。
但在我当前的项目中,用户不会访问 Web 应用程序,因为它只会执行一次同步工作,并且没有任何其他功能可供最终用户使用。所以在这种情况下,同步作业将永远不会运行,因为应用程序池不会处于活动状态。 如果这些方法听起来对解决我的问题有效,任何人都可以提出建议:-
- 创建一个将每小时调用操作方法 URL 的 Windows 计划任务:-
schtasks /create /tn "我的计划任务" /tr "powershell -ExecutionPolicy 不受限制 -Command \"(New-Object Net.WebClient).DownloadString(\\http://url .to.be.executed/cron.php\\")\" /sc DAILY /st 07:00:00 /ru System
- 在 global.asax 中创建 2 个计划任务。一个调度任务将每 5 分钟调用一次应用程序 url 以保持应用程序池处于活动状态,另一个调度任务每小时调用一次同步操作方法。在这种情况下,应用程序将每 5 分钟调用一次自身,这将强制应用程序池处于活动状态,并且即使没有用户访问系统,同步作业也会每小时运行一次……
请问有人可以就这方面提出建议吗?
谢谢
【问题讨论】:
-
您在寻求什么样的建议?你需要清楚。对了,你可以配置Hangfireto always run。
-
@mason 但是我可以添加一个 Windows 计划任务,例如每 10 分钟调用一次应用程序,并按原样使用 hangfire,而无需将其配置为始终运行?
-
当然,我想你已经知道了。
-
应用程序池如果没有收到请求就会关闭。如果你有东西向它发出请求,那么它不会因为空闲而关闭。不,Hangfire 不能强迫它保持打开状态。在某些时候,如果应用程序池出现故障,那么它会杀死你的工作。这就是为什么 Hangfire 文档鼓励您在 re-entrant 工作。
-
当然,您可以手动将其删除。或者一个与 HTTP 请求/响应无关的线程可能有一个未处理的异常,导致一切停止。但这没关系。如果我是你,我会停止问无休止的问题,而是实施我正在谈论的内容并了解它是如何工作的。 测试自己。
标签: asp.net iis asp.net-mvc-5 scheduled-tasks application-pool