【发布时间】:2018-02-19 16:23:12
【问题描述】:
我有一个 Web 应用程序,用户可以在其中将任务排入队列以导出一些数据。该过程最多可能需要 2-3 小时,但可以在几秒钟内完成,具体取决于请求的内容。
导出过程会这样处理:
public class ExportCommandHandler: IAsyncRequestHandler<ExportCommand, bool>
{
...
public async Task<bool> Handle(ExportCommand message)
{
return await _externalScheduler.EnqueueJobAsync(new ExportJob(...));
}
}
_externalScheduler.EnqueueJobAsync 目前只是调用暴露在外部进程中的自托管 webapi 方法来在那里开始工作。
这里的问题我想在工作完成时收到通知,以通知用户如果他仍在浏览我们的网站(计划在此处使用 SignalR )。如果它不是托管在外部进程中,那就很明显了。
但是,当它托管在外部进程中时,获得通知的最佳方法是什么?在 Web 应用程序中公开 Web 方法以供外部进程在完成后调用是正确的方法吗?
我们目前正计划使用 Quartz.NET 来处理外部作业,但不介意尝试一些其他的东西,例如 Hangfire。
【问题讨论】:
-
您仍然可以使用 SignalR,您可以在网站上托管集线器并从 api 连接到它,还是我错过了什么?
-
我认为如果您打算发出完成通知以从一个流程跳转到另一个流程,那么复杂性可能会增加很多。如果您有多个要协调的进程,则进行客户端轮询可能会更容易。客户端可以从 DB 中查询您的任务状态,尽管不如 SignalR 酷。但是 Quartz 有工作和触发侦听器的概念,您可以在这里使用它们来通知。
标签: c# asp.net cqrs quartz.net long-running-processes