Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用quartz.net,从远程WCF服务获取状态回调_Wcf_Quartz Scheduler_Wcf Binding_Quartz.net - Fatal编程技术网

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

使用quartz.net,从远程WCF服务获取状态回调,wcf,quartz-scheduler,wcf-binding,quartz.net,Wcf,Quartz Scheduler,Wcf Binding,Quartz.net,可能是一种常见的模式,但我一直找不到任何帮助 我有一个ASP.NET web应用程序托管Quartz,我有一份按时启动的工作。该作业调用远程WCF服务: public class SimpleJob : IJob { public SimpleJob() { } public void Execute(IJobExecutionContext context) { // call some remote service at // ht

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

我有一个ASP.NET web应用程序托管Quartz,我有一份按时启动的工作。该作业调用远程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响应。但是,当它完成时,我希望远程进程告诉Quartz它完成了,,从而激活我的IJobListener,并执行它的常规Quartz操作。所以,这是一个失火而忘却的工作,有一个回调

我怎样才能做到这一点

想法1

我可以在自己的应用程序中创建端点,如下所示:

http://myserver.com/Quartz/JobComplete?jobId=1234
远程服务将调用此端点。但是,Quartz API如何告诉Quartz作业已完成

创意2

在发布了这个问题并阅读了更多内容后,我找到了一个不同的解决方案。这会起作用,但似乎它真的会弄乱石英的线程池。以下是链接:。简而言之,我的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发布/订阅,可能是WCF双工回调。但是,我读到它是脆弱的,我应该避免它:。但是,如果这是错误的,我愿意尝试。我还了解到,这种模式可以通过WCF上的MSMQ实现。但是,听起来(没有Azure队列)这是一条泪痕


不过,对于任何一家酒吧/酒吧,我都有一个问题,就是要告诉石英,工作已经结束了。我该怎么做呢?

我希望我能理解你的问题,我建议修改一下想法1

您可以使用以下流程定义两个作业(类似于两步作业):

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

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

    使用
    SimpleJob
    内的所有操作可能不实用。听起来你需要两个工作,一个触发
    开始某件事,另一个发出完成信号。如果可以的话,我可以写一个答案,说明不同的方法。谢谢,循环参考。这与@alioza提出的想法相同。它可以很好地工作,但我最终完全删除了回调。这肯定是有意义的,并且符合要求。所以,我沿着这条路走。而且,在实施第二个作业时,我不得不问自己“为什么要添加此作业?它只是为了将响应存储在我自己的日志存储库中吗?”现在,我不再为每个作业调用和响应,而是取消了回调。石英石的工作就这样付之东流了。然后,用户有一个不同的屏幕来按状态或ID获取远程进程。这也会使远程服务符合工作流服务。