Spring启动cron表达式调度,调用ApplicationListener的onApplicationEvent

时间:2017-10-21 18:55:52

标签: java spring spring-boot cron

我通过实现ApplicationListener并重写方法编写了一个StartupListener:onApplicationEvent(ContextRefreshedEvent event)。

@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;
    }
  }
}

在这个方法中,我试图根据对应于file的布尔值是否为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布尔值。因此,默认情况下,这些值将为false(实例变量)

@Value("${create.file.some.merchant}")
private boolean createMerchantAFile;

这在StartupListener中出现,现在为false。所以没有创造任何东西。

如果通过调度程序调用,我如何确保从application.prop读取这些值?

1 个答案:

答案 0 :(得分:0)

创建服务并添加其中的所有逻辑,包括从属性find中获取值。在侦听器和调度程序类中注入该bean。