websocket无法通过Spring注入Bean的问题解决方式

问题描述:

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协议是一个持久化协议,多实例单线程,只有启动时会注入。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值