我已經寫了一個StartupListener通過實現ApplicationListener並重寫方法:onApplicationEvent(ContextRefreshedEvent event)。春季啓動cron表達式調度,調用onApplicationEvent的ApplicationListener
@Component
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {
private static Logger logger = LoggerFactory.getLogger(StartupListener.class);
@Value("${create.file.some.merchant}")
private boolean createMerchantAFile;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info("Application context started");
if (createMerchantAFile) {
EmbeddedResponse emb = null;
file = ReportConstants.MERCHANT_A+ ReportConstants.FILE_FORMAT;
try {
emb = genericServices.readJsonFile("merA.json");
generateReport.generateExcelFile(emb, file, "MerchantA");
} catch (IOException ioe) {
logger.error("IO Exception while reading JSON file. Message: ", ioe);
} catch (Exception e) {
logger.error("Exception while reading JSON file. Message", e);
}
createMerchantAFile= false;
}
}
}
在這個方法裏面,我試圖根據對應於文件的布爾值是否爲true來創建一些文件。
使用@Value批註從「application.properties」文件中讀取此布爾值。
這StartupListener工作正常。
現在我希望通過安排他們產生這些文件,所以我加了@EnableScheduling到我的主類文件,並創建了一個方法,一個新的Java文件:
@Component
public class FileGenerationScheduler {
@Autowired
StartupListener startupListener;
@Scheduled(cron = "${file.gen.cron}")
public void generateFileWithCron() {
startupListener.onApplicationEvent(null); //passing null here
}
}
此方法被調用指定的cron表達式,但不從「application.properties」中讀取所有@Value布爾值。因此默認情況下,這些值將爲假(實例變量)
@Value("${create.file.some.merchant}")
private boolean createMerchantAFile;
這存在於StartupListener中,現在爲false。所以沒有創建。
即使通過調度程序調用,我如何確保這些值是從application.prop中讀取的?