是否可以使用Quartz.Net和Spring.Net在MS SQL DB中创建具有预定时间的作业

时间:2011-09-05 11:17:48

标签: c# asp.net spring.net quartz.net

我在asp.net中创建GUI界面,用户将在其中指定计划时间和将来某个时间运行的作业。

我的应用程序中的作业是Person类的实例(如下所示)。在指定的时间,我想运行创建的人员实例的“submit()”方法。

e.g。

public class Person
{
  string User {get;set;}
  public void Submit()
  {
     //create a text file with User entry

  }
}

现在在MS SQL中,我有一个Jobs表。 Jobs表有ScheduledTime(DateTime),JobDetail(XML)列(其中JobDetail列存储Person对象的序列化版本,例如<Person User="TestUser"></Person>,预定时间:2/2/10 12:12:11

我知道Quartz.Net可以在预定的时间运行作业。但我不知道如何使用Quartz.Net和Spring.Net从数据库中获取作业并在预定时间运行它们?

有可能吗?如果是这样,请指导?

1 个答案:

答案 0 :(得分:2)

您需要实现两个独立的组件。触发器和轮询作业运行的东西。到目前为止,根据您的表结构,您可能希望只运行一次的作业,如果不是,则需要添加cron表达式列并创建CronTrigger对象。

要轮询要运行的作业,您可以在此处找到有关如何使用Spring计时器的详细信息: http://static.springsource.org/spring/docs/1.2.9/reference/scheduling.html

Spring的替代方法是在数据库中实现轮询器。例如,创建SQL Server计划作业,我们采用的方法。缺点是您需要将其设计为数据库服务器关闭时丢失的拾取作业。

数据库方法详情

此设计假设只运行一次计划(添加重复您需要添加一个cron转换步骤),并假定计划所做的工作可以由数据库启动。如果只能以编程方式执行,那么Spring是更好的解决方案。

  1. 将“已处理”列添加到您的工作表
  2. 创建一个每分钟(或其他)运行的存储过程
  3. 该程序查找过去未标记为已处理的任何作业,将其踢掉,然后将其标记为已完成
  4. 相关:

    How do I configure Quartz.NET host with Spring.NET

    Running a Job only once Using Quartz