使用quartz.net,从远程WCF服务获取状态回调
可能是一种常见的模式,但我一直找不到任何帮助 我有一个ASP.NET web应用程序托管Quartz,我有一份按时启动的工作。该作业调用远程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
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 您可以使用以下流程定义两个作业(类似于两步作业):
我建议您在步骤2中创建一个带有稍后触发器的作业,作为超时,以防远程服务从不回叫您的端点。使用
SimpleJob
内的所有操作可能不实用。听起来你需要两个工作,一个触发开始某件事,另一个发出完成信号。如果可以的话,我可以写一个答案,说明不同的方法。谢谢,循环参考。这与@alioza提出的想法相同。它可以很好地工作,但我最终完全删除了回调。这肯定是有意义的,并且符合要求。所以,我沿着这条路走。而且,在实施第二个作业时,我不得不问自己“为什么要添加此作业?它只是为了将响应存储在我自己的日志存储库中吗?”现在,我不再为每个作业调用和响应,而是取消了回调。石英石的工作就这样付之东流了。然后,用户有一个不同的屏幕来按状态或ID获取远程进程。这也会使远程服务符合工作流服务。