1. 程式人生 > >在監聽器中使用@Autowried呼叫service層包null的解決方案

在監聽器中使用@Autowried呼叫service層包null的解決方案

公司做熱備份時,需要檢測當前的硬體和衛星是否為告警狀態,檢測到後就新建一個標識(空檔案)。

剛開始,我在監聽器中呼叫server層後來獲取需要的資料,發現始終是為空。於是參考了網站相關的資料發現是因為監聽器是由servlet呼叫的,而@Autowried是由spring來進行管理的,結果當然為空咯。總結的以下幾個解決方案:

【1】使用

WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(HeartbeatDataService.class);

【2】使用@PostConstruct;

【3】繼承InitializingBean介面:如下

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();;
	}

}
spring-web.xml 新增相應配置
	<bean id="checkAlarm" class="com.cdqihang.web.CheckAlarm"/>


經過多次測試最終採用第三種方案,測試已通過。