如何在一个特定的服务器上用相同的代码库运行计划任务

bmp9r5qi  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(224)

我正在做一个springboot项目,它有restapi和一些计划任务( @Scheduled ). 目前我们有两个服务器,我想部署在两个服务器相同的代码。所以,我的要求是,一台服务器应该只提供api请求,而另一台服务器应该只运行cron作业。如何限制第一台服务器运行cron作业。
我能想到的一个解决方案是markscheduler类 @Profile("{spring.profiles.active}") 并使用cron配置文件进行部署..但我必须在application.properties中添加额外的4组配置文件。像cron.prod、cron.dev、cron.qa、cron.stage。所以总共是8套剖面图。
我在这里粘贴我的现有代码。在application.properties中

myservice.lmsurl=${${spring.profiles.active}.myservice.lmsurl}
prod.myservice.lmsurl=https://test.com
qa.myservice.lmsurl=https://test.com
dev.myservice.lmsurl=https://test.com
uat.myservice.lmsurl=https://test.com

在appconfiguration.class中

@Configuration
@ConfigurationProperties("myservice")

public class AppConfiguration {

    @NotEmpty
    private String lmsurl;
}

其他更好的解决方案。

djmepvbi

djmepvbi1#

您只需要“cron”配置文件。对于不同的环境(dev,qa,…),您需要将属性的值外部化。
例如myservice.lmsurl=${myservice.lmsurl}
然后spring将级联以找到值https://docs.spring.io/spring-boot/docs/2.1.9.release/reference/html/boot-features-external-config.html
例如,如果在tomcat中部署,可以在xml文件中设置值。如果在aws中部署,可以将其设置为环境变量。。。
当然,您还必须在这个外部化配置中设置您要使用的概要文件:spring.profiles.active来判断您是否要使用cron。

cron示例

您的计划程序:

@Component
@Profile("cron")
public class CronScheduler {

    @Scheduled(fixedDelay = 43200000)
    public void job1() {
        // some code
    }
}

仅当配置文件处于活动状态时,才会加载此类。在application.properties中,您有:

spring.profiles.active=${profiles.active}

${profiles.active}引用外部属性。检查我提供的链接,看看外部配置是如何工作的。例如,如果您在aws中部署,您可以通过控制台设置环境变量,如果您使用tomcat部署,您将在tomcat/conf/catalina/localhost下有一个xml配置文件。。。
如果变量为空,则使用默认概要文件,并且不会加载标记为“cron”的类。

关于不同的环境

根据经验,您应该始终将不同env的属性外部化。在您的情况下,它是myservice.lmsurl。每个部署环境的url都会更改。因此,它是一个很好的候选人外化。在application.properties中,您有:

myservice.lmsurl=${myservice.lmsurl}

${myservice.lmsurl}告诉spring他必须在某处寻找这个值。位置的顺序在我给spring文档的链接中。在您的每个环境中,必须以与${profiles.active}相同的方式定义值。
以tomcat为例,在yourapplication.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Environment name="profiles.active" value="cron" type="java.lang.String"/>
    <Environment name="myservice.lmsurl" value="https://test.com" type="java.lang.String"/>
</Context>

每个环境的外部文件都不同。

相关问题