ASP.NET CQRS 和长 运行 任务托管在外部进程中
ASP.NET CQRS and long running tasks hosted in external process
我有一个网络应用程序,用户可以在其中排队任务以导出一些数据。该过程最多可能需要 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。
抱歉,我不清楚外部进程是属于第三方系统还是属于您。
如果是第三方,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。
抱歉,我不清楚外部进程是属于第三方系统还是属于您。
如果是第三方,Web 挂钩是一个很好且简单的解决方案。您可以定义一个在外部进程完成时调用的端点。
否则我会建议使用消息系统来传达这两种服务。只需向外部进程发送一条消息以启动导出,并在作业完成后从外部进程发送另一条消息。通过这种方式,您可以确保如果在通知时某项服务已关闭,则该消息将在服务再次启动时立即发送和处理。