我在使用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);
}
}
参考资料: