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

Using quartz.net, get callback for status from remote WCF service

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

我有一个 ASP.NET 托管 Quartz 的 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 的线程池。这是 link: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 进行一些修改。

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

  1. 常规主作业按计划自动触发。
  2. 它创建了第二个没有触发器的作业(新作业 id=XYZ)。它进行 WCF 调用,然后结束。
  3. 远程服务在必要时使用新作业的 ID (XYZ) 调用您的端点。您为新作业创建触发器以立即执行。
  4. 第二步job执行,你可以在里面做清理什么的,自然结束。

我建议您在第 2 步中创建一个带有稍后触发器的作业作为超时,以防远程服务永远不会回调您的端点。