可能是一种常见的模式,但我一直无法找到任何帮助。
我有一个托管Quartz的ASP.NET Web应用程序,我的工作按计划启动。该作业调用远程WCF服务:
public class SimpleJob : IJob {
public SimpleJob() {
}
public void Execute(IJobExecutionContext context) {
// call some remote service at
// http://someserver.com/someservice.svc/StartSomething
// that could take hours to complete
}
}
StartSomething端点将运行很长时间,因此我不能只等待http响应200.但是,当它完成时,我希望远程进程告诉Quartz它已完成,从而激活我的IJobListener,也是常规Quartz的东西。所以,这是一个昙花一现的工作,带有回调。
我该如何做到这一点?
创意1
我可以在自己的应用程序中创建一个端点,如下所示:
http://myserver.com/Quartz/JobComplete?jobId=1234
远程服务将调用此端点。但是,什么是Quartz API告诉Quartz作业已经完成?
创意2
在发布这个问题并阅读更多内容后,我发现了一个不同的解决方案。它会工作,但似乎它会真的混乱Quartz的线程池。这是链接:http://www.interworks.com/blogs/banderton/2009/10/30/long-running-tasks-aspnet。简而言之,我的IJob实现将进入循环,轮询远程服务直到完成。
public void Execute(IJobExecutionContext context) {
var jobComplete = false;
// call remote service
while(jobComplete == false){
var currentJobStatus = // ge tstatus from remote service
if(status == complete) {
jobComplete = true;
}
}
}
创意3
另一种途径是某种WCF Pub / Sub。也许是WCF双工回调。但是,我读到它是片状的,我应该避免它:Best practice for WCF Duplex client。但是,如果这是错的,我愿意尝试。我还读到这种模式可以通过WCF上的MSMQ完成。但是,听起来(没有Azure Queue)就是眼泪。
尽管如此,对于任何Pub / Sub,我都有问题告诉Quartz该工作已经结束。我该怎么做?
答案 0 :(得分:0)
我希望我理解你的问题,我建议你去改变想法1。
您可以使用以下流程定义两个作业(一种两步作业):
我建议您在第2步中创建一个带有后续触发器的作业,以便在远程服务从不调用您的终端时作为超时。