websocket 注入 service对象的方法

websocket注入service对象的方法

SpringBoot + WebSocket

本人使用

@Autowired

发现注入不进去,断点发现service对象为null。
猜测是

 @ServerEndpoint(value = "/dataWebSocket", encoders = ServerEncoder.class)

这个注解造成的依赖替代。

使用如下方法 亲测可行

启动类的主方法

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(PeehqsApplication.class, args);
        DataStatisticsWebSocket.setApplicationContext(run);
    }

websocket服务类的配置

@ServerEndpoint(value = "/dataWebSocket", encoders = ServerEncoder.class)
@Component
public class DataStatisticsWebSocket{

    private static final Logger LOGGER = LoggerFactory.getLogger(DataStatisticsWebSocket.class);

    /**
     * 存放所有在线的客户端
     */
    private static Map<String, Session> clients = new ConcurrentHashMap<>();

    private static ApplicationContext applicationContext;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        DataStatisticsWebSocket.applicationContext = applicationContext;
    }

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.info("有新的客户端连接了dataWebSocket: {}", session.getId());
        //将新用户存入在线的组
        clients.put(session.getId(), session);
    }

    /**
     * 客户端关闭
     * @param session session
     */
    @OnClose
    public void onClose(Session session) {
        LOGGER.info("有用户断开dataWebSocket了, id为:{}", session.getId());
        //将掉线的用户移除在线的组里
        clients.remove(session.getId());
    }

    /**
     * 发生错误
     * @param throwable e
     */
    @OnError
    public void onError(Throwable throwable) {
        LOGGER.error("dataWebSocket发生错误");
    }

    /**
     * 收到客户端发来消息
     * @param message  消息对象
     */
    @OnMessage
    public void onMessage(String message) {
        LOGGER.info("dataWebSocket服务端收到客户端发来的消息: {}", message);
        DataStatisticsService dataStatisticsService = applicationContext.getBean(DataStatisticsService.class);
        dataStatisticsService.statisticsRefresh();
    }


    /**
     * 群发消息
     * @param message 消息内容
     */
    public void sendAll(String message) {
        for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
            sessionEntry.getValue().getAsyncRemote().sendText(message);
        }
    }

    /**
     * @param message 消息内容
     */
    public void sendObject(Object message) {
        for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
            LOGGER.info("dataWebSocket发送内容:{}",message.toString());
            sessionEntry.getValue().getAsyncRemote().sendObject(message);
        }
    }

    /**
     * 发送消息
     * @param session
     * @param message
     * @throws IOException
     */
    public void sendMessage(Session session, String message) throws IOException {
        if(session != null){
            try {
                session.getAsyncRemote().sendText(message);
            }
            catch (Exception e) {
                LOGGER.error("websocket发送信息失败!{}", e.getMessage());
            }
        }
    }


}

附上 websocket 发送对象的编码类

public class ServerEncoder implements Encoder.Text<OperateResult> {
    @Override
    public String encode(OperateResult operateResult)  {
        Object obj = JSONObject.toJSON(operateResult);
        return obj.toString();
    }

    @Override
    public void init(EndpointConfig endpointConfig) {

    }

    @Override
    public void destroy() {

    }
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值