zoukankan      html  css  js  c++  java
  • 基于Quqrtz.NET 做的任务调度管理工具

    基于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 管理工具目录,

    XXXXXXService 调度服务程序集存放在这里

    XXXXXXServiceJobs 任务程序集存放在这里

    要让管理和调度服务都能找得到 任务程序集,需要改一下 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"/>
    ...

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

    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.ShellinDebugServiceQM.Server.exe 然后在运行 QM.Shell.exe 。

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

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

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

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

    QNMB!GSQ

    
    
     
     
    标签: Quartz.net
  • 相关阅读:
    Java修饰符
    java中接口的定义
    抽象类
    final关键字的特点
    hdu6489 2018 黑龙江省大学生程序设计竞赛j题
    POJ 3268 (dijkstra变形)
    poj 2253 floyd最短路
    poj1681 Network
    bzoj1202 狡猾的商人
    Nastya Is Buying Lunch
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4021053.html
Copyright © 2011-2022 走看看