ASP.NET CQRS和在外部进程中托管的长时间运行的任务

时间:2018-02-19 16:23:13

标签: c# asp.net cqrs quartz.net long-running-processes

我有一个Web应用程序,用户可以将任务排入队列以导出一些数据。此过程最多可能需要2-3小时,但可以根据要求在几秒钟内完成。

导出过程将按如下方式处理:

predict()

holdout<-function(){ require("RMOA") #Initialise streams stream<-datastream_dataframe(iris) test<-stream$get_points(n=30) test<-datastream_dataframe(test) #Specify model mymodel<-HoeffdingTree(numericEstimator = "GaussianNumericAttributeClassObserver") #Record execution time for training start_time<-Sys.time() while(!stream$finished) { mymodel <<- trainMOA(model=mymodel, formula = Species ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data=stream) } end_time<-Sys.time() time_taken <- end_time - start_time cat("Finished training. Elapsed time: ", time_taken) #Empty vector to store individual accuracy results of holdout stream elements accuracies<-c() #Record the execution time of holdout evaluation start_time<-Sys.time() while(!test$finished) { samp<-test$get_points(n=1) pred <- predict(mymodel, samp, type="response") } end_time<-Sys.time() time_taken <- end_time - start_time cat("Finished training. Elapsed time: ", time_taken) } 目前只调用外部流程中公开的自托管webapi方法,以便在那里开始工作。

这里的问题我想在工作完成时收到通知,如果他仍在浏览我们的网站(计划在这里使用 SignalR )通知用户它已准备就绪)。如果它没有托管在外部流程中,那将是显而易见的。

但是,当它在外部流程中托管时,获得通知的最佳方法是什么?在Web应用程序中公开Web方法,以便外部进程在完成后调用是一种正确的方法吗?

我们目前正计划使用Quartz.NET处理外部作业,但不介意尝试其他一些东西,比如Hangfire。

1 个答案:

答案 0 :(得分:1)

很抱歉,我不清楚外部流程是由第三方系统拥有还是属于您的。

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

否则我建议使用消息传递系统来传达这两种服务。只需向外部进程发送消息即可启动导出,并在作业完成时从外部进程发送另一条消息。这样,您可以确保在通知时一个服务停止运行,一旦服务再次启动,就会发送和处理该消息。