2011-03-15 57 views
2

我正在编写一个需要在特定时间运行任务的应用程序,因此我打算为此使用Quartz.NET。尽管需要运行的任务有多个步骤,其中一些可能会有点集中,所以我正在考虑使用类似MSMQ的任务对任务的每个部分进行排队,并且使用传播负载的较小的重点子任务一点任务。Quartz.net和/或MSMQ?

唯一的问题是,它会绕过我想用来确保任务完成的Quartz.NET失败任务功能。

任何人都可以提出一种方法来使用Quartz.NET单独做一切?或者如何使用MSMQ以及仍然能够使用Quartz.NET的“任务失败”功能? (或者我可能不知道的任何其他方式?)

回答

1

这听起来很像NServiceBus中构建于MSMQ之上的传奇概念。你派遣工作给节点,他们回应他们的工作(或失败)。然后这个事件协调接下来应该发生什么任务。

http://docs.particular.net/nservicebus/sagas/

一个利用NServiceBus这种情况的主要原因是,它抽象掉了很多的基础设施为你的,它有你在专注于业务的行为,并对应于该行为的事件。

0

您可以从Quartz.Net任务中安排其他任务。这将使您能够为所有子选项卡使用任务失败功能,但是您无法将其应用于主任务。这实质上提供了您想要实现的相同功能,而不必使用MSMQ。

0

该问题仅指定传播工作的负载是可取的,而不是将控制交给另一个任务/进程/消息处理程序的异步调用。

既然如此,Quartz工作可以将“任务”消息推送到MSMQ上,以便其他一些服务可以提取。然后它可以在退出Execute方法之前等待另一个队列中的“响应”消息。它可以通过轮询该队列来做到这一点。一旦它收到成功或失败的消息,就可以完全退出Execute方法或投掷JobExecutionException

此解决方案不太优雅。请求/响应机制和传输可以被抽象出来,例如,通过WCF或NServiceBus,但事实上,隐含在基本上是双工通信之后意味着它不适合MSMQ。尽管如此(参见http://www.codeproject.com/Articles/41907/WCF-Duplex-MSMQhttp://docs.particular.net/samples/fullduplex/)。您可能会更好地使用某种类型的Web服务,异步调用它们并等待所有完成项。