我在使用websocket時,我想在@ServerEndpoint聲明的websocket服務器中通過@autowired自動注入一個對象,可是失敗了,不管怎麼用構造注入還是怎麼的,都失敗了,後來在網上看了很多資料,確實可以通過Spring 上下文來獲取該對象。
這是在沒改之前@ServerEndpoint中
找到解決方案後(貼源碼):
@ServerEndpoint("/websocket/getStreamingAnalysis")
@Controller
public class WebSocketServer implements Serializable{
/*
* 與某個客戶端的連接會話,需要通過它來給客戶端發送數據
*/
private Session session;
/*
* 保證線程安全,用來存放每個客戶端對應的WebSocketServer對象。
*/
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
/*
* 提供一個spring context上下文(解決方案)
*/
private static ApplicationContext applicationContext;
/*
* 要注入的StreamingConfig對象
*/
private StreamingConfig streamingConfig;
public static void setApplicationContext(ApplicationContext applicationContext) {
WebSocketServer.applicationContext = applicationContext;
}
/**
* 連接建立成功調用的方法
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this);
if(streamingConfig == null) {
//這裏通過spring 上下文來獲取我想要的對象
streamingConfig = applicationContext.getBean(StreamingConfig.class);
String listenerDirectory = "hdfs://192.168.233.128:9000/input";
streamingConfig.startStreamTask(message -> {
try {
for (WebSocketServer ws : webSocketSet) {
//停留1秒再發送
Thread.sleep(1000);
session.getBasicRemote().sendText(message);
}
} catch (IOException e) {
e.printStackTrace();
}catch(InterruptedException e) {
e.printStackTrace();
}
}, listenerDirectory);
}
}
/**
* 連接關閉調用的方法
*/
@OnClose
public void onClose() {
//config.destroyStreamTask();
webSocketSet.remove(this);
}
/**
* 收到客戶端消息後調用的方法
*
* @param message 客戶端發送過來的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
}
/**
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
/**
* 實現服務器主動推送
*/
public void sendMessage(String message) throws Exception {
}
/**
* 羣發自定義消息
* */
public static void sendInfo(String message) throws Exception {
}
}
然後在啓動springboot的主類配置:
@SpringBootApplication
public class SparkanalysisApplication {
public static void main(String[] args) {
//解決springboot和websocket之間使用@autowired注入爲空問題
ConfigurableApplicationContext applicationContext =
SpringApplication.run(SparkanalysisApplication.class, args);
//這裏將Spring Application注入到websocket類中定義的Application中。
WebSocketServer.setApplicationContext(applicationContext);
}
}
參考資料: