黄昌可
摘要:文章探讨了Quartz.NET任务调度系统在医院信息化中的应用。通过对任务调度系统的介绍和Quartz.NET的特点分析,文章提出了基于Quartz.NET的任务调度系统在医院信息化中的应用方案,主要包括任务调度系统的设计和实现、任务执行监控和报警机制的建立等方面。该方案在实际应用中,有效提高了医院信息化系统的运行效率和管理水平,减轻人工负担,提高医院服务水平,具有较高的实用价值和推广意义。
关键词:Quartz.NET;任务调度;医院信息化
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2023)13-0063-04
开放科学(资源服务)标识码(OSID)
0 引言
随着医疗技术的不断更新和人口老龄化的加剧,医院信息化已成为医院管理和服务水平提升的必要手段。医院信息化需要高效稳定的系统支持,这就需要任务调度系统来定时执行重复性任务、监控任务执行情况、自動报警等。
任务调度系统是实现医院信息化系统高效稳定运行的关键技术之一。它可以通过减轻人工负担和提高工作效率,帮助医院信息化系统实现自动化运维和提高管理水平。
1 Quartz.NET任务调度系统介绍
Quartz.NET任务调度系统是一款开源的任务调度框架,具有高可靠性、高精度、高扩展性等特点。它支持复杂的任务调度逻辑和大规模分布式任务调度,基于C#编写,具有良好的跨平台性和可扩展性。Quartz.NET采用简单易用、高度灵活的API,可以轻松创建和管理大量的定时任务。Quartz.NET可以灵活地配置任务的执行周期,支持多种任务触发器,同时还提供了任务执行状态监控、异常报警、任务重试等功能。在医院信息化系统中,Quartz.NET的应用方案可以包括任务调度器、任务触发器和任务执行器等组件的设计和实现,以及任务执行监控和报警机制的建立。
通过基于Quartz.NET的任务调度系统,医院信息化系统可以实现自动化运维,自动化执行重复性任务,提高工作效率,减轻人工负担。例如,医院可以通过任务调度系统来实现定时备份数据库、定时清理日志等任务的自动化执行。此外,任务调度系统还可以对医院信息化系统的运行情况进行实时监控和管理,及时发现问题并进行处理,提高系统管理水平。在未来的发展中,可以进一步优化任务调度系统的设计和实现,加强任务执行监控和报警机制的建立,提高医院信息化系统的智能化程度。例如,可以通过引入机器学习和人工智能等技术,来自动优化任务调度策略,提高任务执行效率和质量。
2 基于Quartz.NET的任务调度系统在医院信息化中的应用方案
2.1 Quartz.NET框架基础概念
Quartz框架是一个开源的作业调度框架,具有强大灵活的调度规则配置、作业状态监控和故障恢复等功能。使用Quartz框架可以为企业信息管理系统的定时调度任务进行简单快捷灵活的配置调度机制,实现企业常规和非常规的复杂调度功能。开发人员可以根据业务的具体需求设置调度的时间点或时间间隔来进行具体的任务调度。Quartz框架能够通过与Spring很好地集成来提供强大的、可灵活配置的调度功能并应用到J2EE Web应用的开发中,它在企业应用调度开发中占据极其重要的地位,是目前比较受欢迎的且很易用的任务调度框架。
Quartz任务调度框架最重要的核心三件套为:任务调度器(Scheduler) 、触发器(Trigger) 和任务(Job) [1]。其中调度任务的核心管理者是任务调度器(Scheduler) ,调度任务的操作者是触发器(Trigger) ,调度任务(Job) 是系统中相应的功能模块。开发者可以设定作业触发器监听规则,针对特定的业务计划需求来进行作业计划,它们的关系如图1所示。
调度器(Scheduler) 是Quartz框架最主要的核心模块,它对Quartz的应用运行的环境起到管理的作用,Quartz框架主要的API也是调度器(Scheduler) 。对于利用Quartz开发的工程师来说,Scheduler是Quartz调度框架与工程师人员发生构建的中间桥梁,大多数的交互行为都是以Scheduler为基础进行的。Scheduler调度器通过协调框架内的JobDetail任务模块和Trigger触发器模块来执行具体的任务调度事件,而不是独立地完成一个调度任务。JobDetial和Trigger只需要注册登记到Scheduler,调度作业就会伴随着应用的启动自动执行。一个完整的Quartz调度任务,必须包括三个核心组件要素:触发器(Trigger) 、调度器(Scheduler) 和任务(Job) 。触发器就是一个定时任务的驱动器,负责对配置的作业进行定时执行。一个调度任务可以配置多个触发器,但一个触发器只能驱动一个作业任务。Quartz作为一款优秀的开源调度框架,它能够与Spring集成整合实现强大的调度作业,而且对运行环境也没有特别的依赖,此外Quartz还提供了强大的集群及分布式能力,其强大的调度机制支持更多个性化的调度方法[2]。
Quartz.NET是一个全功能开放的开源作业调度系统。完全由C#编写的.NET类库,是一个非常流行的开源Java工作调度框架QuartzAPI的移植,可用于winform和asp.net应用中[3]。它拥有强大的灵活性,但同时也保持了简洁性。能够用它来创建一个简单的或复杂的调度作业。它具有大量特性,比如:数据库支持、集群、插件、支持Cron表达式等。
2.2 模块接口介绍
在Quartz.NET中,有以下几个重要的类:
1) Schdeuler类:这个类的方法是将调度任务数据写入系统内存,使Quartz.NET在设定的时间触发作业执行。
2) Job接口:用户自定义的作业在该模块实现。用户只需将自定义的需求在Job接口的execute方法中实现,任务被触发时,execute方法便会被调用执行,即用户自定义的逻辑被执行。
3) JobDetail类:该类包含了任务的各种属性,如任务名称、任务分组名、任务类名等。而任务类名则是实现Job接口的任务类,它包含了具体执行任务的逻辑。在JobDetail类中,还可以添加一些JobDataMap数据,用于传递任务执行所需的参数。
4) Trigger类:该类是Quartz.NET的核心类,用于触发作业。它支持两种触发类型的设置:Cron表达式型和Interval型。通过设置开始时间、结束时间、执行次数等,可以实现对任务的详细控制。Cron表达式型可以设置更加丰富和复杂的时间触发规则,而Interval型则可以设置固定的时间间隔来触发任务。通过Trigger类,可以更加灵活地配置Quartz框架中的任务,实现更加精细化的任务调度。
①Cron表达式方式
Cron表达式是Quartz.NET特有的字符串,当Quartz.NET读取到该表达式时,会自动解析出该表达式的含义,从而实现用户期望的调度计划,表达式分为七段,分别表示秒、分、时、日、月、周、年。示例见表1。
②Inteval方式
Inteval方式与Cron表达式不同,它以精确的间隔来触发任务,即每次触发的间隔是恒定不变的。Quartz.NET中间隔的单位一般是秒、分、时,最大不会大于小时[4]。
在Quartz.NET的架构中,自定义任务的实现需要实现Job接口,并将业务逻辑代码写入execute方法中。任务的具体参数由JobDetail类定义,包括任务名称、任务分组名、任务类名等。任务的调度计划由Trigger类定义,如指定任务的触发时间点或时间间隔等。注册任务到系统进程需要调用Scheduler类的Schedule.scheduleJob(JobDetail, Trigger)方法。当调度任务被触发时,任务引擎通过Scheduler类解析出JobDetail类中包含的作业参数,并通过JobDataMap数据传递任务所需的参数给新的任务实例,用于执行任务的execute方法。
Quartz框架提供了JobDetail类和Trigger类来帮助实现任务的配置和调度计划,从而实现任务的自动化调度和执行。这些特性可以提高系统的可靠性和效率。
2.3 基础使用介绍
Quartz.NET框架的核心模块是调度器scheduler、job类的实例JobDetail以及trigger类的实例SimpleTrigger和CronTrigger。在使用Quartz.NET框架时,先用schedulerFactory实例化一个调度器scheduler。在程序代码中可以直接实例化这个工厂类并且使用工厂的实例,其示例代码如下:
ISchedulerFactory schedulerFactory=new ISchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler();
scheduler.Start();
JobDetail对象用于绑定Job实例。它包含了Job的各种属性,其示例代码如下:
public class HttpResultfulJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
#TaskOptions taskOptions = context.GetTaskOptions();獲取job的参数
Console.Out.WriteLineAsync("Test HttpResultfulJob Job!");
}}
然后可以在Main方法中绑定该Job:
IJobDetail job = JobBuilder.Create
.WithIdentity(taskOptions.TaskName, taskOptions.GroupName).Build();
Trigger对象被用来触发自定义的任务计划。希望将任务加入进程,要实例化一个Trigger并且“调整”它的属性以满足想要的进度安排。Quartz.NET框架里面有许多不同类型的Trigger,但最常用的Trigge类是SimpleTrigger和CronTrigger SimpleTrigger。立即运行,按设定的Cron表达式执行代码如下:
ITITrigger trigger = TriggerBuilder.Create()
.WithIdentity(taskOptions.TaskName, taskOptions.GroupName)
.StartNow()
.WithDescription(taskOptions.Describe)
.WithCronSchedule(taskOptions.Interval)
.Build();
最后将任务注册到scheduler中即可:
scheduler.ScheduleJob(job, trigger);
2.4 任务调度实现
首先,需要将Quartz.net添加到项目中。可以通过NuGet包管理器或通过手动下载并添加引用的方式添加Quartz.net,接着创建一个Job类,在这个类中实现实际的任务。Job类必须实现IJob接口,并实现Execute方法。Execute方法是任务的实际代码。需要注意的是,Job类必须是一个无状态的类,因为Quartz.net会在需要执行Job时创建Job的实例,因此如果Job类包含任何状态,可能会导致意外的行为。完成Job部分后,再创建Trigger,指定任务的执行时间。Trigger必须指定一个唯一的名称和分组,以便在Scheduler中进行管理。然后就可以创建Scheduler,也就是任务调度的核心组件,将Job和Trigger添加到Scheduler中。Scheduler将根据Trigger指定的时间表执行Job。可以使用StdSchedulerFactory来创建Scheduler实例。
最后可以通过调用Scheduler的Start方法来启动Scheduler。此时,Scheduler就会开始执行Job,并按照Trigger指定的时间表触发任务了。
2.5 可视化
Quartz.NET提供了一些调度器监听器和日志记录器,方便对任务的执行情况进行监控和调试。
为了方便任务的管理,可以使用可视化设计对所有任务进行界面化的管理。将每个定时任务的各项属性,如作业的名称、作业所属分组、Cron表达式、作业描述、执行情况、执行api地址等以一条完整记录形式存入数据库中。这样,一个个任务就转化成关系表中的一条条记录,定时任务的可视化管理也就转变为常见的关系表的可视化管理[5]。
使用MVC架构,将页面操作,与调度任务的控制,包装到控制器(controller) 中,在视图(View) 中调用相关方法,展示及持久化调度任务数据,部分展示如图2、图3。
2.6 解决应用程序池回收
当应用程序池长时间运行,IIS 会将其自动回收,以保证服务器的稳定性和性能。但是这种自动回收有时会影响应用程序的正常运行,因此需要进行相应的处理[6]。这里采用注册系统服务,定时调用处理。
在Quart.NET的Web项目中创建一个HealthController类,并增加一个KeepAlive方法,方法的实现,直接返回当前时间即可,然后在应用程序的项目中调用这个地址,并将定时调用的程序注册为系统服务。
应用注册为系统服务.bat:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe
D:\...\bin\Debug\Quartz.NET.WindowsService.exe
Net Start Quartz.Net sc config Quartz.Net start= auto
3 实际应用效果分析
除了提高医院信息化系统的运行效率和管理水平之外,Quartz.NET的任务调度系统还可以带来以下实际应用效果:
1) 降低系统维护成本:使用任务调度系统可以减少人工干预,降低系统维护成本。自动化执行的任务可以避免人为错误和疏漏,提高系统稳定性和可靠性。例如,定时备份数据库、定时清理日志等任务都可以通过任务调度系统来实现自动化执行,从而降低系统维护成本。
2) 提高数据安全性:任务调度系统可以实现数据备份、数据清理等任务,保护医院信息化系统中的重要数据,提高数据安全性。例如,定时备份数据库可以保护数据不会因为系统故障或人为错误而丢失,提高数据安全性。任务调度系统还可以监控任务的执行情况,及时发现异常情况并进行处理,进一步提高数据安全性。
3) 支持多样化的任务调度:Quartz.NET的任务调度系统支持多种任务调度方式,如简单调度、Cron调度等,可以满足不同的任务调度需求。例如,简单调度可以设置指定时间间隔重复执行任务,Cron调度可以根据复杂的时间表达式来执行任务,满足不同的任务调度需求。同时,任务调度系统还支持任务依赖关系设置,可以确保任务按照正确的顺序执行,避免任务之间的冲突和错误。
4) 增强系统可扩展性:任务调度系统可以通过自定义Job和Trigger来实现自定义任务的调度,增强系统的可扩展性和灵活性。例如,自定义Job和Trigger可以满足医院信息化系统中不同业务部门的需求,增强系统可扩展性。此外,任务调度系统还支持集群部署,可以通过增加节点来扩展系统的处理能力。这意味着,当系统负载增加时,可以通过增加节点来提高系统的处理能力,增强系统的可扩展性。
5) 提高任务执行效率:任务调度系统可以实现任务并发执行,提高任务执行效率。例如,在医院信息化系统中,有些任务需要同时执行多个实例,任务调度系统可以根据系统配置的并发数来实现多个实例的同时执行,提高任务执行效率。
因此,Quartz.NET的任务调度系统在医院信息化系统中具有重要的应用价值,可以为医院信息化系统的运行和管理带来更多实际效果。任务调度系统的自动化执行和监控功能可以提高运行效率和管理水平,同时降低系统维护成本,提高数据安全性,满足不同的任务调度需求,增强系统可扩展性,提高任务执行效率。
4 结束语
Quartz.NET作业调度框架的API在多个方面都表现出了极佳的性能与易用性。在医院信息化中,该框架具有较高的实用价值和推广意义。可视化的作业调度管理不仅可以通过页面直观地展示各个任务的运行状态,而且上次任务失败原因也会被捕获并在页面上展示。这方便了开发者或运维人员及时发现任务调度中存在的问题,以便快速解决问题。
参考文献:
[1] 王添男,李新庆,徐晓庆,等.基于气象大数据云平台的自动化告警应用研究[J].宁夏工程技术,2021,20(4):352-356.
[2] 刘光明,朱肖颖.Web应用与Quartz的整合研究[J].企业科技与发展,2018(3):114-116.
[3] 李林,杨才,关晓军,等.自动气象站监控平台数据传输故障短信通知系统的开发与应用[J].青海科技,2017,24(4):58-65.
[4] 沈宇杰.基于Quartz的可自定義作业调度系统的设计与实现[J].通化师范学院学报,2019,40(4):78-81.
[5] 叶刚.基于Quartz的可视化定时任务管理方案[J].电子技术与软件工程,2018(17):139-140.
[6] 田雅.基于.NET应用系统性能优化的研究与实践[J].计算机光盘软件与应用,2013(5):173-174.
【通联编辑:谢媛媛】