【问题标题】:Using quartz.net, get callback for status from remote WCF service使用quartz.net,从远程WCF服务获取状态回调
【发布时间】:2015-06-04 18:42:56
【问题描述】:

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

我有一个托管 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 工作已经完成的 Quartz API 是什么?

想法 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 队列)那是一滴眼泪。

不过,对于任何 Pub/Sub,我都遇到了告诉 Quartz 工作已经结束的问题。我该怎么做?

【问题讨论】:

  • SimpleJob 内完成所有操作可能不切实际。听起来您需要两份工作,一份触发StartSomething,另一份发出完成信号。如果没问题,我可以写一个答案,展示不同的方法。
  • 谢谢您,CircularReference。这与@alioza 提出的想法相同。它会很好用,但我最终完全删除了回调。

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


【解决方案1】:

我希望我能理解您的问题,我建议您使用想法 1 并进行一些修改。

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

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

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

【讨论】:

  • 这绝对是有道理的,并且符合要求。于是,我走上了这条路。而且,当我在实施第二份工作时,我不得不问自己“我为什么要添加这个工作?只是为了将响应存储在我自己的日志存储库中吗?”现在,我最终消除了回调,而不是对每个单独的工作进行呼叫和响应。 Quartz 工作一劳永逸。然后,用户有一个不同的屏幕来按状态或 ID 获取远程进程。这也具有远程服务可以符合工作流服务的效果。
猜你喜欢
  • 2014-06-18
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多