vmax-quartz
vmax-quartz是vmax项目的定时任务管理模块,基于开源quartz开发,为vmax应用提供精简的API接口创建和管理定时任务。
特性
免配置极简使用
只需在build.sbt中增加一行引用即可使用。支持异常处理
支持任务超时、失败重试等异常处理。支持串并行和互斥控制
默认为并发执行,可设置任务为串行或与其他任务互斥执行。支持历史任务回溯
支持对任务执行历史记录进行保存和回溯。提供Listener机制
方便对任务执行过程中各种事件进行监控。支持个性化配置
在有需要时,也可对默认配置进行修改以适应应用场景。提供配套客户端
方便对已创建任务和历史任务进行查看和管理。
开始使用
vmax-quartz发布在mvn私服。目前发布的是snapshot版本。使用此版本只需在build.sbt中加入:
libraryDependencies += "com.xxx.bigdata" %% "vmax-quartz" % "SNAPSHOT" changing()
使用示例
创建一个任务只需简单两步:
创建一个任务类型(JobClass)
// 定义这个任务所需的参数 case class FileDownloadJobParameter(files: List[String]) // 继承VmaxJob,在process中实现具体业务逻辑。 可通过context.jobPara获取schedule时传入的参数 class FileDownloadJob extends VmaxJob { override def process(context: VmaxJobExecutionContext): Unit = { val para = context.jobPara.asInstanceOf[FileDownloadJobParameter] ... // 写具体的业务逻辑 } } // 推荐采用伴生对象方法固化每一个JobClass的Key object FileDownloadJob { val key = VmaxJobClassKey("File Download", "Neighbor Cell Optimize") }
注册任务类型,创建并调度不同的任务
object BasicDemo extends App { // 注册一个JobClass VmaxScheduler.register(FileDownloadJob.key, classOf[FileDownloadJob], VmaxJobParameter(Nil, 0, 60)) // 创建并立即调度一个名为"File Download Now"的新任务 VmaxScheduler.scheduleNow(FileDownloadJob.key, "File Download Now", FileDownloadJobParameter(List("file1", "file2"))) // 创建"File Download Every Minute"任务,并每分钟执行一次 VmaxScheduler.schedule(FileDownloadJob.key, "File Download Every Minute", FileDownloadJobParameter(List("file3", "file4")), "0 1 * * * ?") }
说明
- VmaxJobParameter用于描述任务类型的相关属性,字段含义如下:
字段 含义 exclusiveJobs 互斥任务列表,标明这类任务与其他哪类任务互斥。默认为空。 retryTimes 当任务失败时,最大重试次数,默认为0,即不重试。 timeoutInSecond 任务超时时间,单位为秒。默认值-1,即不做超时控制。 isSerial 标识此类任务是否为串行,默认为False,即并发执行。 requestRecovery 标识当程序硬重启后,此类任务是否被重新执行。默认为False。 - “0 1 * * * ?” 为cron表达式,表示每分钟执行一次。
如何启动服务
vmax-quartz使用标准JMX接口对客户端发布服务。如需使用客户端对服务器进行管理,需要在启动程序时添加JVM选项。示例:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl="false"
-Dcom.sun.management.jmxremote.authenticate="false"
如使用Intellij IDEA启动服务,可在Run->Edit Configurations->VM options中添加上面的配置。
配置选项详解
1. 配置选项
# 你可在自己的工程中创建配置文件,设置如下全部或部分选项(没配置的会使用如下默认值)。
vmaxquartz {
# Scheduler的名字,各应用可设置为自己个性化的名字
schedulerName = "VmaxDefaultScheduler"
# 最大线程数。由于处在阻塞状态的任务也会占用一个线程,所以线程数越大,相当于支持的阻塞队列就越大。
# 但要注意,线程数越大,占用内存也越大,所以需要根据应用实际情况合理设置
threadCount = 100
# 检测任务超时的精度,单位为秒。默认值为5,即每5秒检测一次是否有任务超时。
timeoutPrecision = 5
# 数据库相关配置
database {
# 数据库连接的用户名
username = "sa"
# 数据库连接的密码
password = ""
# 数据库文件所在位置,默认为当前目录下的/database/quartz.h2.db文件
# 注意:后缀.h2.db不用写
filepath= "./database/quartz"
# 数据库最大连接数
maxConnections = 10
}
}
2. 修改默认配置文件
- 默认的配置文件是resources目录下的vmaxquartz.conf文件。如不存在,则所有选项都使用默认值。
如需修改默认的配置文件,可在代码中使用VmaxQuartzConfigProvider。 示例:
// 修改vmax-quartz配置文件为resources下的sample.conf VmaxQuartzConfigProvider.reset("sample.conf")
FAQ
Q: 如何知道一个任务完成了?
A: 可以给任务增加Listener,监听jobComplete事件。例:
继承VmaxJobListener,实现一个监听jobComplete事件的Listener。
class JobCompleteListener extends VmaxJobListener { override def jobComplete(result: VmaxJobResult, context: VmaxJobExecutionContext): Unit = { // 在这写当任务完成时你要做的操作... } }
在调度这个任务时,将Listener添加进去。这样当任务完成时就会回调jobComplete方法。
VmaxScheduler.schedule(FileDownloadJob.key, "File Download Every Minute", FileDownloadJobParameter(List("file3", "file4")), "0 1 * * * ?", List(new JobCompleteListener())) }