我需要您的建议来安排MVC3 Webapp中的任务。使用Quartz.NET的MVC3 webapp任务调度
我的任务是为webapp中的不同服务创建一些通用调度程序,以便以后在开发中使用。例如,我们有一些用户可以随时安排的可用任务。
我不想重新发明轮子,并找到可用于创建调度程序的Quartz.Net库。我知道这是不是一个好主意,主持调度内部Web应用程序原因Web服务器可以回收应用程序池等,所以我决定在Windows服务中使用它,然后使用Quartz.NET远程处理功能来触发我内部的任务Web应用程序。
但我发现了一些问题。纠正我,如果我错了,但是当我试图使用Quartz.NET远程处理它运行Windows服务进程内的作业,这意味着它需要知道我的web应用程序内的所有类型,所以所有程序集的webapp应该引用它,我需要另一个数据库配置文件等,所以如果我写新的工作类,我不能轻松地安排它,我需要停止服务,并更新它的库,所以这不是非常通用的方法。
我找不到Quartz.NET只能根据它的接口运行作业的任何信息。
所以我想出了一个想法,写我自己的调度程序,它将被托管在Windows服务中,并且将有一些IJob接口将在webapp中实现。我还将使用IPC通道使用.Net远程处理。 因此,webapp会像.Net Remoting Server一样,当我想添加一些新的工作然后安排它时,我只需要编写实现IJob接口的新工作。 我会在这种情况下,注册为
IpcChannel channel = new IpcChannel("CurrentIPC");
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(SimpleJob), "SimpleJob", WellKnownObjectMode.SingleCall);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ComplexObject), "ComplexObject", WellKnownObjectMode.SingleCall);
我将不得不注册了两个作业类型。然后,调度工作,当我会把Windows服务端的类和名字,将代表客户机(在web应用端执行的对象),我将只是IJob绑定类的传递的名称是这样的:
Dictionary<string, IJob> jobs = new Dictionary<string, IJob>();
void AddJob(string name)
{
IJob obj = (IJob)Activator.GetObject(typeof(IJob), string.Format("ipc://CurrentIPC/{0}", name));
jobs.Add(name, obj);
}
所以,现在我不需要操心我的应用程序和其他的东西引用,调度会做的工作不知道什么,只是IJob接口和web应用程序端执行的任务。
如果我错了或它太复杂了,还有一些其他更简单的方法来做到这一点,或者有一些我不知道的陷阱,你能帮我吗? 谢谢。
P.S. 此外还有一个想法,有单独的调度程序,它将通过执行指向Web应用程序中的指定服务的链接直接运行Web应用程序方法,例如“http:// localhost:3030/Request/12”,就这样,但在我的网络应用程序中,您应该被授权执行此类请求,并且我们还有问题需要解决,并且在数千个计划任务的情况下,我们将在网络服务器上额外加载这些请求。
如果选择了这种方法,可能会出现另一个问题。并发 - 调用相同的作业url将触发两个作业执行。如果是电子邮件,您可能会最终发送两封相同的电子邮件。 –
这是真的,如果这是一个问题,那么可能需要一些安全措施,或者在调度程序中假定url唯一标识作业实例或可能在作业中,假设作业能够识别类似作业正在运行或已经完成。 –