摆脱困境:将环境特定的Cron表达式与@Scheduled批注一起使用
@Scheduled注釋提供了一種在Spring驅(qū)動(dòng)的應(yīng)用程序中創(chuàng)建計(jì)劃任務(wù)的簡(jiǎn)便方法。 我們可以使用它通過(guò)定期調(diào)度或cron表達(dá)式來(lái)調(diào)度我們的任務(wù)。
盡管時(shí)段調(diào)度也可能有用,但是cron表達(dá)式使我們對(duì)調(diào)度任務(wù)的調(diào)用有了更多的控制。 這就是為什么它們?cè)诂F(xiàn)實(shí)生活中非常有用的原因。 但是,如果執(zhí)行不正確,使用cron表達(dá)式將有一個(gè)主要缺點(diǎn)。 讓我們找出那是什么。
創(chuàng)建計(jì)劃任務(wù)
假設(shè)我們要?jiǎng)?chuàng)建一個(gè)任務(wù),該任務(wù)每秒被調(diào)用一次,并且僅將一條消息寫(xiě)入日志。 我們可以按照以下步驟創(chuàng)建此任務(wù)(由于本文的第二部分對(duì)此進(jìn)行了描述,因此我們將跳過(guò)所需的配置):
ScheduledJob類(lèi)的源代碼如下所示:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;@Component public class ScheduledJob {private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledJob.class);@Scheduled(cron = "0-59 * * * * *")public void run() {LOGGER.debug("run()");} }我們實(shí)現(xiàn)的問(wèn)題是cron表達(dá)式是硬編碼的。 這意味著不可能在不同的環(huán)境中使用不同的配置。
如果要在不同的環(huán)境中使用不同的調(diào)度配置,則必須在創(chuàng)建部署的二進(jìn)制文件之前手動(dòng)更改配置。
這自然是容易出錯(cuò)的。 由于使用錯(cuò)誤的調(diào)度配置的后果可能很?chē)?yán)重,因此我們必須找到一種方法來(lái)將cron表達(dá)式從代碼移動(dòng)到項(xiàng)目的配置文件中。
將Cron表達(dá)式移動(dòng)到屬性文件
在尋找解決問(wèn)題的方法時(shí),我遇到了這個(gè)問(wèn)題。 本博客文章中描述的解決方案就是基于該討論。
我們解決方案的要求如下:
- 生產(chǎn)和開(kāi)發(fā)環(huán)境必須具有不同的配置。
- 在開(kāi)發(fā)環(huán)境中運(yùn)行計(jì)劃任務(wù)時(shí),必須每秒調(diào)用一次。
- 在生產(chǎn)環(huán)境中運(yùn)行計(jì)劃任務(wù)時(shí),必須每分鐘調(diào)用一次。
我們可以通過(guò)執(zhí)行以下步驟來(lái)滿足這些要求:
讓我們開(kāi)始吧。
配置Maven
我們可以按照以下步驟配置Maven:
讓我們繼續(xù)前進(jìn),找出實(shí)現(xiàn)方法。
為開(kāi)發(fā)和生產(chǎn)環(huán)境創(chuàng)建配置文件
我們記得,我們必須為開(kāi)發(fā)和生產(chǎn)環(huán)境創(chuàng)建Maven配置文件。
我們可以按照以下步驟創(chuàng)建在開(kāi)發(fā)環(huán)境中使用的配置文件:
我們可以按照以下步驟創(chuàng)建生產(chǎn)資料:
pom.xml文件的配置文件部分如下所示:
<profiles><profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><build.profile.id>dev</build.profile.id></properties></profile><profile><id>prod</id><properties><build.profile.id>prod</build.profile.id></properties></profile> </profiles>在配置構(gòu)建的資源過(guò)濾時(shí),將使用build.profile.id屬性。 讓我們看看這是如何完成的。
配置資源過(guò)濾
我們可以按照以下步驟配置資源過(guò)濾 :
pom.xml文件的相關(guān)部分如下所示:
<filters><filter>profiles/${build.profile.id}/config.properties</filter> </filters> <resources><resource><filtering>true</filtering><directory>src/main/resources</directory></resource> </resources>創(chuàng)建屬性文件
我們可以按照以下步驟創(chuàng)建所需的屬性文件:
讓我們開(kāi)始吧。
為開(kāi)發(fā)環(huán)境創(chuàng)建屬性文件
我們可以按照以下步驟為開(kāi)發(fā)環(huán)境創(chuàng)建屬性文件:
profiles / dev / config.properties文件的內(nèi)容如下所示:
scheduling.job.cron=0-59 * * * * *為生產(chǎn)環(huán)境創(chuàng)建屬性文件
我們可以按照以下步驟為生產(chǎn)環(huán)境創(chuàng)建屬性文件:
profile / prod / config.properties文件的內(nèi)容如下所示:
scheduling.job.cron=0 0-59 * * * *創(chuàng)建我們的應(yīng)用程序的屬性文件
我們可以按照以下步驟創(chuàng)建應(yīng)用程序的屬性文件:
src / main / resources / application.properties文件的內(nèi)容如下所示:
scheduling.job.cron=${scheduling.job.cron}配置應(yīng)用程序上下文
我們可以使用Java配置類(lèi)或XML配置文件來(lái)配置應(yīng)用程序的應(yīng)用程序上下文。
下面介紹了這兩個(gè)選項(xiàng)。
Java配置
我們可以按照以下步驟創(chuàng)建應(yīng)用程序上下文配置類(lèi):
我們的應(yīng)用程序上下文配置類(lèi)的源代碼如下所示:
import org.springframework.context.annotation.*; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.annotation.EnableScheduling;@Configuration @EnableScheduling @ComponentScan(basePackages = {"net.petrikainulainen.spring.trenches.scheduling" }) @PropertySource("classpath:application.properties") public class ExampleApplicationContext {@Beanpublic PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();properties.setLocation(new ClassPathResource( "application.properties" ));properties.setIgnoreResourceNotFound(false);return properties;} }XML配置
我們可以按照以下步驟創(chuàng)建應(yīng)用程序上下文配置文件:
我們的應(yīng)用程序上下文配置文件的源代碼如下所示:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"><context:property-placeholder location="classpath:application.properties" ignore-resource-not-found="false"/><context:annotation-config/><context:component-scan base-package="net.petrikainulainen.spring.trenches.scheduling"/><task:annotation-driven/> </beans>修改計(jì)劃任務(wù)
最后一步是修改任務(wù)類(lèi),并確保從application.properties文件中讀取了使用的cron表達(dá)式。 我們可以通過(guò)將@Scheduled批注的cron屬性的值設(shè)置為'$ {scheduling.job.cron}'來(lái)實(shí)現(xiàn)。
ScheduledJob類(lèi)的源代碼如下所示:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;@Component public class ScheduledJob {private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledJob.class);@Scheduled(cron = "${scheduling.job.cron}")public void run() {LOGGER.debug("run()");} }摘要
現(xiàn)在,我們創(chuàng)建了一個(gè)計(jì)劃任務(wù),該任務(wù)從屬性文件中讀取使用的cron表達(dá)式。 這篇博客文章教會(huì)了我們?nèi)?#xff1a;
- 我們了解到,對(duì)使用的cron表達(dá)式進(jìn)行硬編碼會(huì)使在不同環(huán)境中使用不同配置變得困難。
- 我們了解了如何使用Maven將特定于配置文件的配置屬性分離為特定于配置文件的配置文件。
- 我們學(xué)習(xí)了配置應(yīng)用程序的應(yīng)用程序上下文并從屬性文件中讀取使用的cron表達(dá)式。
與往常一樣,此博客文章的示例應(yīng)用程序可在Github上獲得 。
翻譯自: https://www.javacodegeeks.com/2013/07/spring-from-the-trenches-using-environment-specific-cron-expressions-with-the-scheduled-annotation.html
總結(jié)
以上是生活随笔為你收集整理的摆脱困境:将环境特定的Cron表达式与@Scheduled批注一起使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 科大讯飞宣布讯飞星火即日起向全民开放,能
- 下一篇: 百度:未来竞争在于做出多少 AI 原生应