用 Spel 用另一个 spring 值计算一个 Spring 值

Evaluate a Spring value by another spring value with Spel

我有一个 属性 来自 application.properties

housekeeping.shortInterval=true

我想在我的 java 代码中评估一个值,这取决于此:

    @Scheduled(fixedRateString = "#{housekeeping.shortInterval == true ? 60000 : 3600000*24}")
    public int doHousekeeping()
    {...}

不幸的是,这不起作用。我做错了什么?

第二个问题: 编写测试这个表达式输出的测试的最简单方法是什么?

第一个问题的答案:

您需要将 属性 括在 ${} 之间,如下例所示:

@Scheduled(fixedRateString = "#{${housekeeping.shortInterval} == true ? 60000 : 3600000*24}")

我已经在我的电脑上测试过,它按预期工作。

第二个问题的答案:

请参阅下面的示例以在 Spring Boot 中测试 CRON。修改您的调度程序方法以存储 CRON 值-

import java.time.LocalDateTime;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import lombok.extern.log4j.Log4j2;

@Component
@Log4j2
public class ScheduleTask {
    @Value("${housekeeping.shortInterval}")
    private boolean shortInterval;
    private long cronValue;

    @Scheduled(fixedRateString = "#{${housekeeping.shortInterval} == true ? 60000 : 3600000*24}")
    public void scheduleTask() {
        this.cronValue = ((shortInterval == true) ? 60000 : 3600000 * 24);
        log.info("Executed at {}", LocalDateTime.now());
    }

    public long getCronValue() {
        return this.cronValue;
    }
}

测试时检查 CRON 值:

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ScheduledTaskTest {

    @Autowired
    ScheduleTask task;

    @Test
    public void scheduleTask_Cron_Test() {
        //Test CRON value
        assertEquals(task.getCronValue(), 60000l);
    }
}