2017-10-21 77 views
0

我已經寫了一個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中讀取的?

回答

0

創建一個服務並添加其中的所有邏輯,包括從屬性查找中獲取值。將該bean注入偵聽器和調度程序類中。