我正在做一个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;
}
其他更好的解决方案。
1条答案
按热度按时间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示例
您的计划程序:
仅当配置文件处于活动状态时,才会加载此类。在application.properties中,您有:
${profiles.active}引用外部属性。检查我提供的链接,看看外部配置是如何工作的。例如,如果您在aws中部署,您可以通过控制台设置环境变量,如果您使用tomcat部署,您将在tomcat/conf/catalina/localhost下有一个xml配置文件。。。
如果变量为空,则使用默认概要文件,并且不会加载标记为“cron”的类。
关于不同的环境
根据经验,您应该始终将不同env的属性外部化。在您的情况下,它是myservice.lmsurl。每个部署环境的url都会更改。因此,它是一个很好的候选人外化。在application.properties中,您有:
${myservice.lmsurl}告诉spring他必须在某处寻找这个值。位置的顺序在我给spring文档的链接中。在您的每个环境中,必须以与${profiles.active}相同的方式定义值。
以tomcat为例,在yourapplication.xml中:
每个环境的外部文件都不同。