在監聽器中使用@Autowried呼叫service層包null的解決方案
阿新 • • 發佈:2019-02-08
公司做熱備份時,需要檢測當前的硬體和衛星是否為告警狀態,檢測到後就新建一個標識(空檔案)。
剛開始,我在監聽器中呼叫server層後來獲取需要的資料,發現始終是為空。於是參考了網站相關的資料發現是因為監聽器是由servlet呼叫的,而@Autowried是由spring來進行管理的,結果當然為空咯。總結的以下幾個解決方案:
【1】使用
WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(HeartbeatDataService.class);
【2】使用@PostConstruct;
【3】繼承InitializingBean介面:如下
spring-web.xml 新增相應配置public class CheckAlarm implements InitializingBean{ protected final Log logger = LogFactory.getLog(getClass()); @Resource private HeartbeatDataService heartbeatDataService; @Override public void afterPropertiesSet() throws Exception { new Thread(new Runnable() { @Override public void run() { //實時檢測當前是否為告警狀態 while(true){ String dirpath = "/home/run"; String downPath = dirpath+"/down"; File dir = new File(dirpath); File down = new File(downPath); //獲取心跳包資訊 HeartbeatData heartbeatData = heartbeatDataService.getHeartbeatData(); //檢測是否為空 if(null == heartbeatData){ logger.error("heartbeat pack gets null,Can not create a 'down' file!"); break; } //若二者都不為空則刪除down檔案,反之則新增 if(heartbeatData.getSatellite() == 0 && heartbeatData.getDeviationValue() == 0){ if(!down.exists()) down.delete(); }else{ if(!dir.exists()) dir.mkdirs(); if(!down.exists()){ try { down.createNewFile(); } catch (IOException e) { logger.error("createNewFile error"); break; } } } } } }).start();; } }
<bean id="checkAlarm" class="com.cdqihang.web.CheckAlarm"/>
經過多次測試最終採用第三種方案,測試已通過。