gpt4 book ai didi

java - 在 Spring Boot IntegrationTest 上禁用 @Schedule

转载 作者:IT老高 更新时间:2023-10-28 13:53:38 24 4
gpt4 key购买 nike

如何在 Spring Boot IntegrationTest 上禁用计划自动启动?

谢谢。

最佳答案

请注意,外部组件可能会自动启用调度(参见 Spring Framework 中的 HystrixStreamAutoConfigurationMetricExportAutoConfiguration)。因此,如果您尝试在指定 @EnableScheduling@Configuration 类上使用 @ConditionalOnProperty@Profile,那么由于外部组件,无论如何都会启用调度。

一个解决方案

有一个 @Configuration 类可以通过 @EnableScheduling 进行调度,然后将你的调度作业放在单独的类中,每个类都使用 @ConditionalOnProperty 来启用/禁用包含@Scheduled 任务的类。

不要将 @Scheduled@EnableScheduling 放在同一个类中,否则您将遇到外部组件启用它的问题,因此 @ConditionalOnProperty 被忽略。

例如:

@Configuration
@EnableScheduling
public class MyApplicationSchedulingConfiguration {
}

然后在一个单独的类中

@Named
@ConditionalOnProperty(value = "scheduling.enabled", havingValue = "true", matchIfMissing = false)
public class MyApplicationScheduledTasks {

@Scheduled(fixedRate = 60 * 60 * 1000)
public void runSomeTaskHourly() {
doStuff();
}
}

这个解决方案的问题是每个计划的作业都需要在它自己的类中,并指定 @ConditionalOnProperty。如果您错过了该注释,那么作业将运行。

另一种解决方案

扩展 ThreadPoolTask​​Scheduler 并覆盖 TaskScheduler 方法。在这些方法中,您可以检查作业是否应该运行。

然后,在您使用@EnableScheduling 的@Configuration 类中,您还创建一个名为taskScheduler 的@Bean,它返回您的自定义线程池任务调度程序。

例如:

public class ConditionalThreadPoolTaskScheduler extends ThreadPoolTaskScheduler {

@Inject
private Environment environment;

// Override the TaskScheduler methods
@Override
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
if (!canRun()) {
return null;
}
return super.schedule(task, trigger);
}

@Override
public ScheduledFuture<?> schedule(Runnable task, Date startTime) {
if (!canRun()) {
return null;
}
return super.schedule(task, startTime);
}

@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
if (!canRun()) {
return null;
}
return super.scheduleAtFixedRate(task, startTime, period);
}

@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
if (!canRun()) {
return null;
}
return super.scheduleAtFixedRate(task, period);
}

@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Date startTime, long delay) {
if (!canRun()) {
return null;
}
return super.scheduleWithFixedDelay(task, startTime, delay);
}

@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long delay) {
if (!canRun()) {
return null;
}
return super.scheduleWithFixedDelay(task, delay);
}

private boolean canRun() {
if (environment == null) {
return false;
}

if (!Boolean.valueOf(environment.getProperty("scheduling.enabled"))) {
return false;
}

return true;
}
}

使用我们的自定义调度程序创建 taskScheduler bean 并启用调度的配置类

@Configuration
@EnableScheduling
public class MyApplicationSchedulingConfiguration {

@Bean
public TaskScheduler taskScheduler() {
return new ConditionalThreadPoolTaskScheduler();
}
}

上面的潜在问题是您已经创建了对内部 Spring 类的依赖,因此如果将来有更改,您必须修复兼容性。

关于java - 在 Spring Boot IntegrationTest 上禁用 @Schedule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40684903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com