使用quartz.net,从远程WCF服务获取状态回调

时间:2015-06-04 18:42:56

标签: wcf quartz-scheduler wcf-binding quartz.net

可能是一种常见的模式,但我一直无法找到任何帮助。

我有一个托管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该工作已经结束。我该怎么做?

1 个答案:

答案 0 :(得分:0)

我希望我理解你的问题,我建议你去改变想法1。

您可以使用以下流程定义两个作业(一种两步作业):

  1. 常规主要工作按计划自动启动。
  2. 它创建第二个没有触发器的作业(新作业ID = XYZ)。它进行WCF调用然后结束。
  3. 远程服务必须使用新作业(XYZ)的ID调用您的终端。您可以为新作业创建一个立即执行的触发器。
  4. 执行第二步作业,你可以清理它或者你需要做的任何事情,它会自然结束。
  5. 我建议您在第2步中创建一个带有后续触发器的作业,以便在远程服务从不调用您的终端时作为超时。