Spring的时候可以把假时钟传给预定任务吗?

qni6mghb  于 2023-02-15  发布在  Spring
关注(0)|答案(1)|浏览(120)

我正在尝试测试一天运行一次的预定方法。

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:scheduler id="myScheduler" pool-size="10" />
<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="refillingServiceImpl" method="refill"
                    cron="0 0 21 * * *" />
</task:scheduled-tasks>
<task:executor id="myExecutor" pool-size="5"/>

方法按照我的系统时间在指定的时间运行。但是所有在应用程序中使用日期/时间的非调度方法都使用共享的Clock示例,当我想设置测试的特定时间时-我只需更改Clock示例。在测试之前,我将Clock设置为20:59:50

//June 18, 2020 20:59:50 Local Time (Kiev, GMT +3), Thursday
    long offset = 1592503190 - Instant.now().getEpochSecond();
    TimeUtil.setClock(Clock.offset(Clock.system(TimeUtil.getDefaultZoneId()), Duration.ofSeconds(offset)));

,但是我不知道怎么说调度器使用这个时钟而不是系统。有可能吗?

ddhy6vgd

ddhy6vgd1#

通过向ThreadPoolTaskScheduler传递一个固定时钟来创建一个bean:

@Configuration
@Profile("test")
public class TestThreadPoolTaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler
            = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix("TestThreadPoolTaskScheduler");
        threadPoolTaskScheduler.setClock(getFixedClock());
        return threadPoolTaskScheduler;
    }

    private static Clock getFixedClock() {
        return Clock.fixed(Instant.parse("2023-02-07T05:15:00Z"), ZoneId.of("UTC"));
    }
}

相关问题