显示导航

安排365bet地区应用程序中的定期任务

365bet地区了解如何使用Schwartz在365bet地区应用程序中安排定期任务

s伊万·洛佩斯·塞尔吉奥·德尔阿莫

365bet地区版本 3.3.2

训练

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

如今,通常有一些克朗或计划的任务,需要每周几个小时每隔半夜运行一次。在Java世界中,我们一直在使用石英图书馆很久以来做到这一点

在本指南中,您将学习如何使用365bet地区365bet地区 Schwartz插件365bet地区安排365bet地区应用程序中的定期任务

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails schwartz初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails schwartz完成

编写指南

安装插件

要安装插件修改建立gradle:

建立gradle
buildscript存储库mavenLocal maven url"https repo grails org grails核心"依赖类路径"org grails grails gradle插件$grails版本"类路径"gradle插件com精力充沛的工作webdriver binaries webdriver binaries gradle插件"类路径"gradle插件com精力充沛的想法gradle插件"类路径"org grails插件休眠${gormVersion"发布"}"类路径"com bertramlabs插件资产管道gradle"类路径'与敏捷轨道施华兹' (1)
    }
}
1 Schwartz插件

并将以下内容添加到依存关系

建立gradle
编译'与敏捷轨道施华兹'

设置包演示的日志级别INFO

在本指南中,我们将使用几个日志语句来显示作业执行

在末尾添加logback groovy下一条语句

365bet地区应用程序配置会议日志回切
日志'演示'信息'标准输出'], )

上面的代码行为包配置了一个记录器演示具有使用STDOUT附加程序的日志级别INFO且适应性设置为false

创建一个简单的工作

365bet地区该插件提供了新的365bet地区命令来创建新作业,只需执行

grailsw创建工作HelloWorld

这将创建文件grails应用程序服务演示HelloWorldJobService groovy并举例说明了如何触发工作

365bet地区请注意,Schwartz作业不是365bet地区工件,但是该插件使用以sufix命名作业的约定Jobservice作业文件默认放置在365bet地区应用程序服务目录,尽管有不同的选项可以创建一个POGO

Schwartz Job的最基本框架是

grails应用程序服务演示HelloWorldJobService groovy
 HelloWorldJobService 实施施瓦茨乔布(1)

    虚空执行JobExecutionContext上下文抛出JobExecutionException(2)
    }

    虚空buildTriggers(3)
    }
}
1 实行施瓦茨乔布
2 工作逻辑在这里
3 工作的不同触发因素

让我们修改前面的代码并添加以下代码

grails应用程序服务演示HelloWorldJobService groovy
虚空执行JobExecutionContext上下文抛出JobExecutionException日志信息"{}:{}"上下文触发键 SimpleDateFormat("dd M yyyy hh mm ss"格式 日期()) (1)
}

虚空buildTriggers(2)触发工厂'每秒钟简单的工作'intervalInSeconds10建立(3)触发工厂'每秒钟简单的工作'启动延迟5000intervalInSeconds45建立
1 工作名称和日期
2 每秒钟创建一个触发器
3 每秒钟创建另一个触发器,初始延迟为毫秒

现在启动应用程序

gradlew bootRun

几秒钟后,您将看到以下输出

缺省情况下,每秒执行一次简单作业(1)缺省情况下,每秒执行一次简单作业(2)缺省情况下,每秒执行一次简单作业(3)每秒钟默认的简单作业星期五Jan CET默认默认值每秒钟简单的作业星期五Jan CET DEFAULT每秒钟的简单作业Fri Jan CET DEFAULT简单的每秒钟分数Fri Jan CET默认的每秒钟简单的作业Fri Jan CET(4)缺省情况下,每秒执行一次简单作业
1 应用程序启动后立即执行秒作业
2 秒启动作业仅在应用启动后几秒钟启动启动延迟在触发配置中
3 秒执行第二次作业,第一次执行仅数秒
4 秒执行第二次作业,第一次执行仅数秒

服务中的业务逻辑

尽管前面的示例是有效的,但通常您不希望将业务逻辑放入作业中。更好的方法是创建附加服务,Jobservice调用这种方法使您的业务逻辑与调度逻辑脱钩,此外,它还支持测试和维护,让我们来看一个示例

创建以下服务

grails应用程序服务演示EmailService groovy
演示进口 常规转换CompileStatic

静态编译
 电邮服务 {

    虚空发送用户日志信息"发送电子邮件至${用户}"
    }
}

然后工作

grails应用程序服务演示DailyEmailJobService groovy
静态编译
自我
 DailyEmailJobService 实施SchwartzJob EmailService emailService(1)

    虚空执行JobExecutionContext上下文抛出JobExecutionException emailService发送'电子邮件保护') (2)
    }

    虚空buildTriggers触发工厂'每日电子邮件工作'cronSchedule"0 30 4 1/1 * ? *") (3)建立
1 注入服务
2 叫它
3 每天在AM触发一次工作

Cron表示法常常令人困惑为了简化触发器定义,该插件附带了多个构建器。这些构建器支持流畅的API,您最终得到了可读且直观的代码来定义触发器和IDE自动完成功能

以前的cron配置可以写成

今天在DailyEmailJobService groovy上发布了grails应用服务演示
进口 com agileorbit schwartz SchwartzJob
进口 演示EmailService
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j
进口 组织石英JobExecutionContext
进口 组织石英JobExecutionException
进口 静态的 今天的组织石英DateBuilder
进口 静态的 org石英DateBuilder明天

静态编译
自我
 DailyEmailJobService 实施施瓦茨乔布最后 整型小时4
    最后 整型分钟30
    最后 整型0EmailService emailService(1)

    虚空执行JobExecutionContext上下文抛出JobExecutionException emailService发送'电子邮件保护') (2)
    }

    日期每日日期日期从今天开始在HOUR MINUTE SECONDS如果startAt之前 日期())) {
            返回明天在HOUR MINUTE SECONDS startAt虚空buildTriggers日期startAt dailyDate触发工厂'每日电子邮件工作'startAt startIntervalInDays1建立

手动安排数据作业

想象以下情况,您想在每个用户注册到您的应用程序后的几个小时内向他们发送一封电子邮件,您想向他询问与用户首次互动时的体验

对于本指南,我们将安排作业在一分钟后触发

修改BootStrap常规两次调用名为的新服务注册服务.

365bet地区应用程序初始化演示BootStrap groovy
演示进口 常规转换CompileStatic

静态编译
 引导带RegisterService registerService定义初始化servletContext registerService注册'电子邮件保护'睡觉20register服务注册'电子邮件保护')
    }
    定义破坏

创建RegisterService groovy

grails应用服务演示RegisterService groovy
演示进口 与agileorbit schwartz QuartzService
进口 com agileorbit schwartz生成器BuilderFactory
进口 常规时间TimeCategory
进口 常规转换CompileDynamic
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j
进口 组织石英JobDataMap
进口 组织石英JobDetail
进口 组织石英JobKey
进口 组织石英触发器
进口 组织石英TriggerBuilder

进口 Java文本SimpleDateFormat

自我
静态编译
 注册服务QuartzService crystalService虚空寄存器电子邮件日志信息'节省在'电子邮件 SimpleDateFormat("dd M yyyy hh mm ss"格式 日期scheduleFollowupEmail电子邮件动态编译
        日期开始日期(1)
                日期起动机 日期使用TimeCategory startAt startAt1分钟开始虚空scheduleFollowupEmail电子邮件JobDataMap jobDataMapJobDataMap jobDataMap放入'电子邮件'电子邮件触发器触发器TriggerBuilder newTrigger forJob JobKey jobKey FollowupEmailJobService simpleName(2)使用作业数据JobDataMap的startAt startAtDate(3)构建quartzService scheduleTrigger触发器(4)
        }
}
1 此方法返回未来一分钟的日期
2 我们可以找到必要的工作键与JobService的simpleName
3 我们可以将数据传递到Job执行中
4 安排触发器

创建FollowupEmailJobService groovy

grails应用程序服务演示FollowupEmailJobService groovy
演示进口 com agileorbit schwartz SchwartzJob
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j
进口 组织石英JobDataMap
进口 组织石英JobExecutionContext
进口 组织石英JobExecutionException

进口 Java文本SimpleDateFormat

自我
静态编译
 后续电子邮件工作服务 实施施瓦茨乔布虚空执行JobExecutionContext上下文抛出JobExecutionException JobDataMap jobDataMap上下文已合并电子邮件jobDataMap getString'电子邮件') (1)日志信息'传送追踪电子邮件至'电子邮件 SimpleDateFormat("dd M yyyy hh mm ss"格式 日期())
        }

        覆写
        虚空buildTriggers
1 提取作业数据

如果执行上面的代码,您将在安排好计划的一分钟后看到工作,并使用提供的电子邮件地址执行该工作

INFO演示RegisterService保存电子邮件保护在INFO演示RegisterService保存电子邮件保护在INFO演示中,跟踪电子邮件作业服务将跟踪电子邮件发送至电子邮件保护在INFO演示中,跟踪电子邮件作业服务将跟踪电子邮件发送至电子邮件保护

并发作业执行

365bet地区想象一下,您使用365bet地区开发了一个软件即服务应用程序,您希望每天凌晨AM检查用户的订阅是否已到期。如果完成了,您想为新期间创建发票,请保存该发票并更新用户的订阅到期时间数据库中的日期

您只想使用Quartz禁用这样的作业的并发执行,您需要使用DisallowConcurrentExecution施瓦兹您仍然可以做到,或者如果您愿意,可以实现特质有状态的施瓦茨工作代替施瓦茨乔布. 有状态的施瓦茨工作扩展形式施瓦茨乔布并添加两个注释DisallowConcurrentExecution, 执行后PersistJobData.

示例代码可能看起来像

grails应用程序服务演示GenerateGenevoiceJobService groovy
演示进口 com敏捷轨道schwartz StatefulSchwartzJob
进口 grails gorm Transactions事务性
进口 组织石英JobExecutionContext
进口 组织石英JobExecutionException
进口 静态的 今天的组织石英DateBuilder
进口 静态的 org石英DateBuilder明天

 GenerateInvoiceJobService 实施有状态的施瓦茨工作最后 整型小时7
    最后 整型分钟0
    最后 整型0GenerateInvoiceService generateInvoiceService交易性 (1)
    覆写
    虚空执行JobExecutionContext上下文抛出JobExecutionException generateInvoiceService generateInvoices覆写
    虚空buildTriggers日期startAt dailyDate触发工厂'AM的每日电子邮件工作'startAt startIntervalInDays1建立日期每日日期日期从今天开始在HOUR MINUTE SECONDS如果startAt之前 日期())) {
            返回明天在HOUR MINUTE SECONDS startAt
1 将作业的执行包装在事务中
grails应用服务演示GenerateInvoiceService groovy
演示进口 常规转换CompileStatic

静态编译
 GenerateInvoiceService {

    虚空生成发票检查用户订阅是否完成
        生成新期间的发票并将其保存在数据库中
                更新用户的订阅到期日期
    }
}

摘要

在本指南中,我们学习了如何使用带有插件Fluid API的cron语句手动配置Jobs,此外,我们还学习了如何禁用并发执行或传递Job Data

帮助365bet地区

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队