【问题标题】:ASP.NET CQRS and long running tasks hosted in external processASP.NET CQRS 和托管在外部进程中的长时间运行的任务
【发布时间】: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


【解决方案1】:

抱歉,我不清楚外部进程是归第三方系统所有还是属于您的。

如果是第三方,网络挂钩是一个很好且简单的解决方案。您可以定义一个在外部进程完成时调用的端点。

否则,我会建议使用消息传递系统来传达这两种服务。只需向外部进程发送一条消息以启动导出,并在作业完成时从外部进程发送另一条消息。这样,您可以确保如果在通知的那一刻有一项服务关闭,则该消息将在服务再次启动时立即发送和处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2010-10-11
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多