【发布时间】: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