前兩天突然接到一個緊急需求,要求寫一個tcp接口,定時的獲取客戶端推送過來的數據,並批量入庫。
由於一開始我用postconstruct註解開啓socket服務端,導致本來的tomcat端口未能正常啓動,只開啓了socket端口,從而也使由schedule標註的註解未能生效,(當時還沒意識到是tomcat端口未能正常啓動引起的)於是就改用spring-quartz生成的定時任務。
在寫具體業務功能的時候發現,spring-quartz是不受spring 容器管理的,所以在,quartz的定時任務裏注入由spring容器管理的對象時,該對象始終爲null,於是通過百度發現了common包下的ApplicationContextHelper類,這個類實現了ApplicationContextAware接口,即可以通過應用上下文獲取該對象,參考鏈接爲:https://www.jianshu.com/p/1d82ed2a2d20
代碼如下:
package com.bocom.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* User: panchao
* Date: 2019/12/25
* 解決quartz注入bean爲null的問題
*/
@Component("springApplicationContext")
public class ApplicationContextHelper implements ApplicationContextAware {
@Autowired
private static ApplicationContext appCtx;
@Override
public void setApplicationContext( ApplicationContext applicationContext ) throws BeansException {
appCtx = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return appCtx;
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
public static Object getBean( String beanName ) {
return appCtx.getBean( beanName );
}
}
至此,就可以完成不被spring容器管理的對象的調用了。
以上有提到@Postconstruct註解導致Application主類未被啓動,從而導致tomcat端口不存在,原以爲是這個註解導致的,但是這個註解下放其他的業務方法並不會出現這個問題,由此猜測可能是socket的影響,於是把socket的啓動放到主類一起,然後socket端口和tomcat端口就都正常了。