理解MHS(8):进程级的定时任务

某些情况下,我们需要一些进程级的定时器来处理一些比较特殊的任务,比如定时备份数据库,定时上报数据等等。。。

很显然,在这种情况下,基于纯脚本的被动调用方式将是非常难以处理的。为此,Moon Http Server(MHS)对这种情况做了特殊处理,以满足这种特殊任务的需求。

一、实现方法

1.扩展底层支撑


在MHS的底层,对MHS的启动做了相应的扩展,该扩展很简单,就是在MHS启动时,如果在mhs.exe旁边发现存在脚本文件init.pp的话,会自动调用init.pp脚本文件进行初始化工作。


2.扩展定时器创建函数

为了能够使用定时器控件,MHS扩展了两个函数,分别是:
定时器创建函数:
  function MhsNewSysTimer(const AInterval: Integer; const AScriptFileName: string; RunImediatly: Boolean; const ATimerName: string): Boolean;
该函数的参数分别是:
AInterval:定时器的时间间隔
AScriptFileName:定时器需要执行的脚本文件名
RunImediatly:定时器创建成功后是否立即执行指定的脚本文件
ATimerName:定时器控件的名字
定时器查找函数:
  function MhsGetSysComponent(const AName: string): TComponent;
根据指定的名称查找定时器控件,然后对定时器进行控制。

3.执行过程

启动时自动调用脚本文件init.pp,在init.pp中创建定时器并指定定时器执行脚本文件,当定时器触发事件时自动执行指定的定时器脚本文件。很简单,很有效,扩展性也很强。

二、注意事项

1.因为定时器的作用域是进程级的,所以某些特殊的对象或操作是不适合定时器的,比如客户端的访问管理模块wm(WebModule),请求(Request)和返回(Response)等等。这是很容易理解的。
2.同样,因为定时器是进程级的,所以在操作数据库时需要使用不同的操作方法,有关此处内容请认真参考Lesson115中的内容。
3.如果想对初始化脚本文件init.pp的名字进行指定的话,需要在config.ini中进行添加一行:

    //初始化脚本文件名(进程开始时执行),因需要支持单可执行文件多进程方式,所以必须有此配置
    DefInitWebFileName=myinit.pp

这样配置后,mhs.exe在创建进程后即查找myinit.pp脚本文件并进行执行,如果文件不存在或者没找到则放弃执行。

0 Comments
因网站受黑客垃圾攻击,留言暂时关闭,如有需要,请自行下载源码参考,谢谢。
留言