【asp源码栏目提醒】:本文主要为网学会员提供“整合Web和Windows服务——按预定时间间隔运行ASP NET代码2 - 计算机教材”,希望对需要整合Web和Windows服务——按预定时间间隔运行ASP NET代码2 - 计算机教材网友有所帮助,学习一下!
CreateJob函数采用当前JobID,并且在一个case语句中用它来确定应当返回Job类的哪个子类。
然后,初始化当前的JobID并且返回从Job派生的类。
既然您具有了Job基类、它的特定于作业的子类以及用来选择要创建的类的方式,那么您就可以考察如何使用JobFlow类将这一切组合在一起。
要创建一个名为JobFlow的类以便收集和执行适当的作业,请添加一个名为“RunAllActiveJobs”的函数以遍历您需要运行的每个作业,并调用它们各自的RunSingleJob函数。
您将需要使用RunAllActiveJobs函数来获取预定从数据库中经过业务层、数据访问层和存储过程运行的作业的列表,然后使用其各自的RunSingleJob函数来运行它们。
以下代码显示JobFlow类的RunAllActiveJobs方法如何完成这些目标: JobLogic jl new JobLogic DataSet jobsActiveData jl.GetAllActiveJobs foreach DataRow jobsActive in jobsActiveData.Tables0.Rows int currentJobID Convert.ToInt32jobsActiveJobID Job myJob JobFactory.CreateJobcurrentJobID myJob.RunSingleJob 基本上,您将在数据库中存储作业,同时存储有关它们上次运行的时间以及代码在连续两次运行之间应当等待的时间间隔的信息。
然后,通过BusinessLogic层中带有GetAllActiveJobs方法的JobLogic类来检索需要运行的作业。
每个活动作业的ID都用于获得Job对象,如前所述,该对象的RunSingleJob方法可以用来执行任务。
作业计时信息 确定应当运行哪些预定作业意味着您需要存储有关它们的基本信息,例如,连续两次运行之间的时间间隔、它们的上次运行时间和它们下一次应当运行的时间。
为了完成该工作,请在SQL Server数据库中创建一个作业表(参见表1)。
表1 Job表 Column Datatype JobID int identity JobTitle varchar500 JobInterval datetime DateLastJobRan datetime DateNextJobStart datetime JobID列保持该作业表中每个作业的唯一标识符。
JobTitle列包含作业名称,以便您可以确定哪个作业正在运行。
JobInterval列保持连续两个作业之间的时间间隔。
它们是大于1/1/1900的日期和时间间隔,在作业成功后,应当将其添加到当前时间中,以计算下一个作业应当运行的时间。
例如,JobInterval字段中的值1/2/1901 意味着需要将一年和一天添加到该作业上次运行的时间中。
DateLastJobRan列包含作业上次运行的日期和时间的datetime值。
最后一列 DateNextJobStart包含作业下一次应当运行的时间。
尽管该列应当是一个由JobInterval加DateLastJobRan计算结果而得的列,但如果您将该列设置为常规的datetime列,则可更生动地理解应用程序层。
检索和设置作业计时信息 要通过SQL Server数据库中新的存储过程检索和设置作业计时信息,这些存储过程必须找到该数据库所有需要由该应用程序运行的作业,更新该数据库中单个作业的信息以指示它已经运行,并且设置该作业的下一个作业运行日期。
每个作业都在该数据库中具有一个DateNextJobStart列,以指示该作业应当运行的日期和时间。
如果当前日期和时间已经超过DateNextJobStart列的日期和时间,则应当在该进程中运行该作业。
选择应该运行的作业的存储过程如下所示: CREATE PROCEDURE dbo.Job_SelectJobs_NextJobStartBefore DateNextJobRunStartBefore datetime AS SELECT FROM JOB WHERE DateNextJobStart DateNextJobRunStartBefore 该存储过程在Job表中选择的作业符合以下条件,其DateNextJobStart值早于(小于)DateNextJobRunStartBefore DateTime参数的值。
要查明应当运行哪些作业,只须通过该存储过程的参数传入当前日期和时间。
既然您可以选择需要运行的作业,那么您就可以转而生成该过程以便在作业运行之后更新它们。
用单个作业的上一个运行日期和下一个运行日期更新数据库的存储过程如下所示: CREATE PROCEDURE dbo.Job_Update_StartEnd_