基于Quqrtz.NET 做的任务调度管理工具

国庆前,需求让我看了一下任务调度的数据表设计。和之前一样,有100多个字段,p1 ~ p100, 我说这是干嘛啊!按这写,写死去了!

然后在网上搜了一下开源的任务调度,第一个中意的就是 Quartz.NET,10.1 出来和老领导聚会,老领导说了另外一个东西:Zookeeper, 刚搜了一下,也有.NET的版本。

先入为主,Zookeeper 我就不深入了,整个10.1 在家基本除了看电影就是看 Quartz 了。

Quartz.net 提供了 Remoting 方式,Remoting 我08年的时候,写过个小程序,让一台服务器通知另外一台服务器去执行一些任务,简单的应用,除了这些,在没有深入过了。

看一下结构:

Jobs 下是任务

Listener 没有写好,不显摆了。

QM.Server 是 Quartz 的调度服务

QM.Shell 是一个管理工具

 

我试想把管理工具放到本地来,即服务在服务器上,管理工具在本地,这样就方便管理,但是除非本地能找到调度服务所用的所有的DLL,否则就会因为无法加载类型XXX而无法进行下去。

有了这个问题,那么只好管理工具和调度服务放一起了。

即然要把管理工具和服务放一起,那就不必把DLL COPY的到处都是,但是需要做一些特殊处理

下面是生成的目录结构:

XXXXXX 管理工具目录,

XXXXXX\Service 调度服务程序集存放在这里

XXXXXX\Service\Jobs 任务程序集存放在这里

要让管理和调度服务都能找得到 任务程序集,需要改一下 app.config

管理工具的 app.config

....

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Service/Jobs" />
...

调度服务的 app.config

...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Jobs"/>
...

这样一来,把新写好的任务程序集放到 XXXXX\Service\Jobs 下,管理工具和调度服务都可以找得到了。

 

QM.Server 用到的东西:

Quartz.Net 2.2.4.400

log4net 1.2.10

Common.Logging

Common.Logging.log4net 由于 log4net 选用的是 1.2.10 ,所以这个只能用 2.0 

Topshelf

列出来这些是因为我用 NuGet 搜索安装的 Common.Logging.log4net ,程序一运行就退出。手动指定为 2.0 的 Common.Logging.log4net 才没有问题。

 

调度服务我用的是 SqlCe 4.0 来存任务信息,所以需要安装 SqlCe 4.0 的驱动, 可以从这里下载:

http://www.microsoft.com/en-us/download/details.aspx?id=17876

如果想指定其它数据库,可以修改  quartz.config

quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz 
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz 
quartz.jobStore.dataSource = ds 
quartz.dataSource.ds.connectionString = Data Source=QUARTZ.sdf;Persist Security Info=False; 
quartz.dataSource.ds.provider = SqlServerCe-400

 

因为管理工具是基于 Quartz REMOTING 的,所以要在 quartz.coonfig 中指定以下配置:

quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
quartz.scheduler.exporter.port = 5555
quartz.scheduler.exporter.bindName = TestScheduler
quartz.scheduler.exporter.channelType = tcp
quartz.scheduler.exporter.channelName = httpQuartz

这里我指定的端口号是 5555, bindName 是 TestScheduler, 这两个东西要用在管理工具上。

 

Listener , Listener 不能通过 Remoting 来管理,因为 Not Support. 我尝试做一个通UDP来广播 Listener ,不知道哪里没有写好,就是收不到数据。没有做好,我就不多废话了。

 

管理工具用到的东西:

Quartz

Caliburn.Micro 

看到 Caliburn 就知道这个管理工具是用 WPF 写的了!没什么讲的,上图看看:

连接界面,主机即调度服务所在的IP

端口和 Scheduler 是上面所讲的配置中的 port 和 bindName

触发器/任务列表,可以用来停止/启动/编辑/删除指定的任务。

日历编辑界面,目前只实现了 HolidayCalendar 的编辑,Holiday 是用来指定任务在哪些日期不执行的。

这个功能 Cron 表达式无法做到,其它的基本都可以由 Cron 来做,所以目前只实现了 HolidayCalendar 的编辑。

这个是日历列表界面,右边会跟据不同的日历类型显示日历详细,只是目前只实现了 HolidayCalendar, 所以右边只有这一个界面。

任务编辑界面,触发器类型编辑器目前只实现了 Simple 和 Cron 类型的。

概览。

源码下载:

http://files.cnblogs.com/xling/QuartzJobManager.7z

要运行示例,需要运行 QM.Shell\bin\Debug\Service\QM.Server.exe 然后在运行 QM.Shell.exe 。

Quartz.NET 的API还是挺简单的,还有许多细小功能没有添加上。

另外还有一个分布式的,还没有看相关资料,没有处理。

 

如果觉得对你有用,请点个赞(赞。。。赞。。。赞个屁)!

------------------------------

QNMB!GSQ

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。