问题描述:
websocket类里无法通过@Autowird 或 @Resource注入外部接口,使用时候报空指针异常
解决方式:
@ServerEndpoint("/webSocket")
@Component
public class WebSocket {
//解决方式: 1.需要注入的外部服务类
static RedisBassService redisService;
// 2. 在此处赋值,在OnMessage或其他的方法里就可以通过redisService.get()...使用了
@Autowired
public void setRedisService(RedisBassService redisService){
WebSocket.redisService = redisService;
}
// 用来记录当前连接数的变量
private static volatile int onlineCount = 0;
// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象
public static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<WebSocket>();
//接收人
//private String userId = "";
// 与某个客户端的连接会话,需要通过它来与客户端进行数据收发
private Session session;
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocket.class);
@OnOpen
public void onOpen(Session session) throws Exception {
this.session = session;
webSocketSet.add(this);
LOGGER.info("当前在线人数为:" + webSocketSet.size());
}
@OnClose
public void onClose() {
webSocketSet.remove(this);
LOGGER.info("Close a websocket. ");
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
* */
@OnMessage
public void onMessage(String message, Session session) {
LOGGER.info("Receive a message from client: " + message);
}
@OnError
public void onError(Session session, Throwable error) {
LOGGER.error("Error while websocket. ", error);
}
/**
* 实现服务器主动推送
*/
public void sendMessage(String message) throws Exception {
if (this.session.isOpen()) {
this.session.getBasicRemote().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocket.onlineCount--;
}
}
解释:
Spring中的对象默认都是 单例模式,可以通过使用 @Scope("prototype") 注解使对象成为多例。
@Autowired 或 @Resource注入为单例,Websocket协议是一个持久化协议,多实例单线程,只有启动时会注入。