在項目開發中會經常用到,在項目啓動時候執行某段特定的代碼,這時我們該如何實現呢?
在springBoot中提供了中簡單方法:實現CommandLineRunner接口,並重寫run()方法,並加上
@Component(將該類加入ioc容器中)
如果同時有多個類實現了CommandLineRunner接口可以通過@order接口來指定啓動的加載順序。
代碼例子如下:
@Component
@Order(value = 1)
public class SysExceptionQuartz implements CommandLineRunner {
private static Logger logger = Logger.getLogger(SysExceptionQuartz.class);
@Autowired
private PortalDao portalDao;
@Override
public void run(String... args) throws Exception {
logger.info("項目啓動時,查詢數據庫並創建新的定時任務");
/*查詢出所有系統的生效時間與對應的狀態*/
List<SysInfo> sysInfoList = portalDao.getSysInfo();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
/*獲取系統當前時間*/
Date currentTime = new Date();
if (sysInfoList.size() > 0) {
for (SysInfo s : sysInfoList) {
if(StringUtil.isNil(s.getSysEffectTime())){
continue;
}
Date sysEffectTime = df.parse(s.getSysEffectTime());
/*如果系統生效時間在當前時間之前直接去數據庫更新狀態*/
if (sysEffectTime.after(currentTime)) {
Date sysEffectDate = DateUtil.string2Date(s.getSysEffectTime(), DateUtil.YYYYMMDDHHMMSS);
/*將時間轉化爲cron表達式*/
String cronTimeExpress = CronUtil.getCron(sysEffectDate);
Map<String,String> sysParamMap = new HashMap<>();
sysParamMap.put(s.getSysCode(),s.getEnable().toString());
/*移除已創建的job*/
SysQuartzManager.removeJob("Job"+s.getSysCode(),"Job_Group"+s.getSysCode(),
"Trigger"+s.getSysCode(),"Trigger_Group"+s.getSysCode());
/*添加一個定時任務*/
SysQuartzManager.addJob("Job"+s.getSysCode(),"Job_Group"+s.getSysCode(),
"Trigger"+s.getSysCode(),"Trigger_Group"+s.getSysCode(),cronTimeExpress,sysParamMap);
}else {
if (!s.getEnable().equals("1")){
s.setEnable("1");
portalDao.makeSysEnable(s);
}
}
}
}
}
}