显示导航

预定的365bet地区

365bet地区了解如何使用Spring Task Execution and Scheduling计划365bet地区应用程序中的定期任务

s本·莱茵

365bet地区版本 3.3.2

训练

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

入门

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

在本指南中,您将学习如何使用本机春季任务执行和计划365bet地区安排365bet地区应用程序中的定期任务

有关其他文档,请参见预定的 任务计划程序 定期触发

如何完成指南

要开始,请执行以下操作

要么

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

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

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

要完成指南,请转到初始

  • 光盘进入grails指南grails预定的初始

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

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

写作时间表

365bet地区对我们来说幸运的是,使用Spring Task Execution and Scheduling是365bet地区的即开即用功能,因此无需添加任何其他依赖项。让我们开始吧!

设置包演示的日志级别INFO

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

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

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

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

创建一个简单的工作

由于调度是本机功能,只需执行

grailsw创建服务HelloWorldJob

这将创建文件grails应用程序服务演示HelloWorldJobService groovy用空模板方法

最基本的骨架是

grails应用程序服务演示HelloWorldJobService groovy
交易性 (1)
 HelloWorldJobService {

    定义 serviceMethod() {
        (2)
    }
}
1 默认情况下,服务为交易性
2 工作逻辑在这里

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

grails应用程序服务演示HelloWorldJobService groovy
演示进口 常规转换CompileStatic
进口 groovy util日志记录Slf j
进口 org springframework调度注释Scheduled

进口 Java文本SimpleDateFormat

自我 (1)
静态编译 (2)
 HelloWorldJobService {

    布尔值惰性初始化 (3)

    预定的fixedDelay) (4)
    虚空executeEveryTen日志信息"每秒钟简单的工作",  SimpleDateFormat("dd M yyyy hh mm ss"格式 日期())
    }

    预定的fixedDelayinitialDelay) (5)
    虚空executeEveryFourtyFive日志信息"每秒钟简单的工作",  SimpleDateFormat("dd M yyyy hh mm ss"格式 日期())
    }
}
1 365bet地区尽管365bet地区工件服务控制器会自动注入记录器,但我们使用自我365bet地区获得更好的IDE支持取决于您使用的365bet地区版本自我注解会影响静态编译记录器名称等方面,如365bet地区365bet地区日志记录快速广播.
2 去掉交易性因为此服务不需要交易,所以添加静态编译为了表现
3 365bet地区默认情况下,365bet地区服务是延迟初始化的,您可以禁用此功能,并使用lazyInit属性使初始化急于执行,而无需强制初始化服务,则作业将不会执行
4 每秒钟创建触发器
5 每秒钟创建另一个触发器,初始延迟为毫秒

现在启动应用程序

gradlew bootRun

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

每秒钟简单的工作(1)每秒钟简单的工作(2)每秒钟简单的工作(3)每秒钟简单作业每秒钟简单作业每秒钟简单作业(4)每秒钟简单的工作
1 应用程序启动后立即执行秒作业
2 秒启动作业仅在应用启动后几秒钟启动启动延迟在触发配置中
3 秒执行第二次作业,第一次执行仅数秒
4 秒执行第二次作业,第一次执行仅数秒
使用时预定的, 布尔值lazyInit否是必需的,否则您的计划将无法运行
预定的需要使用CONSTANT值。这意味着尝试为fixedDelay, initialDelay, 克朗ect无法正常工作并导致编译错误

服务中的业务逻辑

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

创建以下服务

grails应用程序服务演示EmailService groovy
演示进口 常规转换CompileStatic
进口 groovy util日志记录Slf j

进口 Java文本SimpleDateFormat

自我
静态编译
 电邮服务 {

    虚空发送用户消息日志信息"发送电子邮件至${用户} : ${信息}"+ '' +  SimpleDateFormat("dd M yyyy hh mm ss"格式 日期())
    }
}

然后工作

grails应用程序服务演示DailyEmailJobService groovy
自我
静态编译
 DailyEmailJobService  {

    布尔值惰性初始化 (1)EmailService emailService(2)

    预定的克朗"0 30 4 1/1 * ?") (4)
    虚空执行emailService发送'电子邮件保护', '测试讯息') (3)
    }
}
1 强制初始化服务而不强制初始化服务作业将不会执行
2 注入服务
3 叫它
4 每天在AM触发一次工作

Cron表示法常常令人困惑,因此,为了帮助您拥有清晰的逻辑并使更高级的调度更容易,接下来我们将使用TaskScheduler来研究作业执行

任务计划程序Bean

首先要开始使用更多高级的调度技术,我们需要创建并注册TaskScheduler bean

创建以下配置文件,其中包含一个新的任务计划程序bean

src main groovy演示SchedulingConfiguration groovy
演示进口 org springframework上下文注释Bean
进口 org springframework上下文注释配置
进口 org springframework调度并发ThreadPoolTask​​Scheduler

组态 (1)
 调度配置 {

    豆角,扁豆ThreadPoolTask​​Scheduler threadPoolTask​​Scheduler ThreadPoolTask​​Scheduler threadPoolTask​​SchedulerThreadPoolTask​​Scheduler threadPoolTask​​Scheduler setThreadNamePrefix"ThreadPoolTask​​Scheduler") (2)threadPoolTask​​Scheduler初始化threadPoolTask​​Scheduler
1 使您的配置可发现
2 所有相关线程将以ThreadPoolTask​​Scheduler为前缀

如果希望允许并发执行,请设置线程池大小exthreadPoolTask​​Scheduler setPoolSize

默认情况下,ThreadPoolTask​​Scheduler仅具有一个可用于执行的线程,这意味着任务将不会同时执行

365bet地区现在配置您的应用程序以自动发现新配置,以便您的新bean可以与标准365bet地区依赖项注入一起使用

grails应用程序初始化演示应用程序
演示进口 grails启动365bet地区App
进口 grails启动配置365bet地区AutoConfiguration
进口 常规转换CompileStatic
进口 org springframework上下文注释ComponentScan

静态编译
组件扫描('演示') (1)
 应用 延伸365bet地区AutoConfiguration静态的 虚空主要[]args 365bet地区App运行应用程序args
1 启用发现其他配置文件

可运行的任务

创建并连接TaskScheduler之后,您需要创建可运行的任务才能执行

创建以下任务

grails应用程序任务演示EmailTask​​ groovy
演示 EmailTask 实施 可运行 { (1)

    电子邮件(2)
    信息(3)EmailService emailService(4)EmailTask​​ EmailService emailService电子邮件信息(5)
        这个emailService emailService这个电子邮件电子邮件这个消息消息覆写
    虚空(6)emailService发送电子邮件
1 实行可运行
2 存储传入的电子邮件地址以备后用
3 存储收到的消息
4 储存进货服务
5 任务构造函数集电子邮件讯息与服务
6 运行任务

手动安排作业

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

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

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

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

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

创建RegisterService groovy

grails应用服务演示RegisterService groovy
演示进口 常规时间TimeCategory
进口 常规转换CompileDynamic
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j
进口 org springframework调度并发ThreadPoolTask​​Scheduler
进口 Java文本SimpleDateFormat

自我
静态编译
 注册服务ThreadPoolTask​​Scheduler threadPoolTask​​Scheduler(1)EmailService emailService(2)

        虚空寄存器电子邮件消息日志信息'节省在'电子邮件 SimpleDateFormat("dd M yyyy hh mm ss"格式 日期scheduleFollowupEmail电子邮件动态编译
        日期开始日期(3)
                日期起动机 日期使用TimeCategory startAt startAt1分钟开始虚空scheduleFollowupEmail电子邮件消息threadPoolTask​​Scheduler计划EmailTask​​ emailService电子邮件消息startAtDate(4)
        }
}
1 TaskScheduler bean的依赖注入
2 emailService的依赖注入
3 此方法返回未来一分钟的日期
4 安排触发器

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

INFO演示RegisterService保存电子邮件保护在INFO演示RegisterService保存电子邮件保护在INFO演示EmailService上发送电子邮件至电子邮件保护跟进您在INFO演示中的体验如何EmailService发送电子邮件到电子邮件保护跟进您的经历如何

带有任务计划程序的简化Cron

在我们之前的cron示例中,我们确实提到过cron常常令人困惑并且不直观。为缓解这种混乱,这里是使用TaskScheduler编写的先前cron配置。

今天在DailyMailJobService groovy上发布了grails应用程序服务演示
进口 演示EmailService
进口 演示EmailTask
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j
进口 org springframework调度并发ThreadPoolTask​​Scheduler
进口 java时间持续时间

自我
静态编译
 DailyMailJobService {
    私人的 最后 整型小时4
    私人的 最后 整型分钟30
    私人的 最后 整型0
    私人的 静态的 最后 一日之内持续时间1getSeconds1000 (4)ThreadPoolTask​​Scheduler threadPoolTask​​Scheduler(1)EmailService emailService(2)

    虚空寄存器电子邮件消息时间表DailyEmail电子邮件消息虚空scheduleDailyEmail电子邮件信息(5)threadPoolTask​​Scheduler scheduleAtFixedRate每天的电子邮件任务电子邮件服务电子邮件日期日期日期每日日期(3)
        日期起动机 日期(小时小时分钟分钟如果startAt之前 日期())) {
            返回起动机1起动机
1 TaskScheduler bean的依赖注入
2 emailService的依赖注入
3 计算开始时间
4 计算重复间隔
5 安排任务的开始时间和重复间隔

使用TaskScheduler编写时间表后,在Bootstrap中注册作业

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

静态编译
 引导带RegisterService registerService DailyMailJobService dailyMailJobService定义初始化ServletContext最后 跟进'跟进您的经历如何'register服务注册'电子邮件保护'跟进睡眠20register服务注册'电子邮件保护'followUp dailyMailJobService注册'电子邮件保护', '每日提醒')
    }
    定义破坏

摘要

在本指南中,我们学习了如何使用预定的使用fixedDelay initialDelay和cron进行批注,以及使用TaskScheduler和任务手动配置作业。此外,我们了解到预定的或任务计划程序阻止并发执行

有关更多信息,请查看Spring任务执行和计划文档了解更多

帮助365bet地区

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

免费咨询

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

Grails OCI团队