SpringBoot结合WebSocket遇到的一些坑,@Autowired注入bean失败

我在使用websocket时,我想在@ServerEndpoint声明的websocket服务器中通过@autowired自动注入一个对象,可是失败了,不管怎么用构造注入还是怎么的,都失败了,后来在网上看了很多资料,确实可以通过Spring 上下文来获取该对象。

这是在没改之前@ServerEndpoint中

找到解决方案后(贴源码):

@ServerEndpoint("/websocket/getStreamingAnalysis")
@Controller
public class WebSocketServer implements Serializable{
	
	/*
	 * 与某个客户端的连接会话,需要通过它来给客户端发送数据
	 */
    private Session session;
    
    /*
     * 保证线程安全,用来存放每个客户端对应的WebSocketServer对象。
     */
    private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();
    
    
    /*
     * 提供一个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);
	}

}

 

参考资料:

https://blog.csdn.net/qq_28289867/article/details/80423042

https://blog.csdn.net/cxfly957/article/details/84345507

你可能感兴趣的:(Java,Spark)