当前位置: 首页 > news >正文

百度云如何做网站最早做视频播放网站

百度云如何做网站,最早做视频播放网站,长沙seo霸屏,建网站多少费用大家好#xff0c;我是小简#xff0c;今天我又大意了#xff0c;在WebSocket这个类上踩坑了。 接下来我讲讲我踩坑的经历吧#xff01; package cn.donglifeng.shop.socket.endpoin;import cn.donglifeng.shop.common.context.SpringBeanContext; import cn.donglifeng.s… 大家好我是小简今天我又大意了在WebSocket这个类上踩坑了。 接下来我讲讲我踩坑的经历吧 package cn.donglifeng.shop.socket.endpoin;import cn.donglifeng.shop.common.context.SpringBeanContext; import cn.donglifeng.shop.common.redis.RedisUtil; import cn.donglifeng.shop.socket.config.WebSocketConfiguration; import cn.donglifeng.shop.socket.util.WebSocketEndpointTool; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils;import javax.annotation.Resource; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.concurrent.atomic.AtomicInteger;/*** author JanYork* date 2023/3/14 11:36* description WebSocket服务端点*/ ServerEndpoint(value /websocket/{uid},configurator WebSocketConfiguration.class) Component Slf4j public class WebSocketEndpoint {Resourcepublic RedisUtil redisUtil;/*** 连接建立成功调用的方法** param session 可选的参数。session为与某个客户端的连接会话需要通过它来给客户端发送数据* param uid 用户id*/OnOpenpublic void onOpen(Session session, PathParam(uid) String uid) {try {redisUtil.socketOnline(Long.parseLong(uid));} catch (Exception e) {e.printStackTrace();}}/*** 收到客户端消息后调用的方法*/OnMessagepublic void onMessage(String message) {if (StringUtils.hasLength(message)) {//TODO 业务逻辑} else {}}/*** 连接错误调用的方法** param error 错误信息*/OnErrorpublic void onError(Throwable error) {error.printStackTrace();}/*** 连接关闭调用的方法** param session 会话* param uid 用户id*/OnClosepublic void onClose(Session session, PathParam(uid) String uid) {}/*** return 在线人数*/public AtomicInteger getOnlineCount() {return new AtomicInteger(redisUtil.countSocketOnline().intValue());} }上面是一个很简单的WebSocket端点服务类。 我打算使用Redis的Bitmap来做连接人数统计。 空指针 Resource public RedisUtil redisUtil;我直接注入我封装的Redis工具类然后自信满满的开始测试。 结果… 居然空指针什么情况 我是百思难得其解呀因为这个类本身也是一个Bean使用了Component注解。 寻找答案 我开始使用万能的浏览器搜索。 于是在一番搜寻后在CSDN东拼西凑综合找到以下答案 首先使用了ServerEndpoint注解的类中使用Resource或Autowired注入都会失败并且报出空指针异常。 原因是WebSocket服务是线程安全的那么当我们去发起一个ws连接时就会创建一个端点对象。 那么问题就在这了根据CSDN上的说明WebSocket服务是多对象的不是单例的。 而我们的Spring的Bean默认就是单例的在非单例类中注入一个单例的Bean是冲突的。 而且我虽然使用Component注解了这个类但是WebSocket的端点仍然不是单例的这个是必须的端点服务不可能单例。 来自CSDN Autowired注解注入对象是在启动的时候就把对象注入而不是在使用A对象时才把A需要的B对象注入到A中。 而WebSocket在刚刚有说到有连接时才实例化对象而且有多个连接就有多个。 如何解决 知道原因还不好解决吗我们开发的适合基本上很常见的遇到要在非Bean的类中使用Bean因为不被Spring容器所管理的类中是无法注入Bean对象的所以我们需要去使用一个上下文类在一开始就将Spring中所有的Bean静态化到上下文类中。 如何实现 定义一个类实现ApplicationContextAware接口 public class SpringBeanContext implements ApplicationContextAware不过需要注意的是这个类也必须要是Bean不如无法获取到Spring的ApplicationContext。 Component public class SpringBeanContext implements ApplicationContextAware {private static ApplicationContext context;Overridepublic void setApplicationContext(NonNull ApplicationContext applicationContext) throws BeansException {context applicationContext;} }重写他的setApplicationContext方法将ApplicationContext赋值给本类静态的属性。 此时当我们启动程序Spring中的Bean对象就全部会被context获取到。 然后我们还需要写从上下文中获取Bean的方法我就直接丢代码了 package cn.donglifeng.shop.common.context;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component;/*** author JanYork* date 2023/3/8 9:33* description SpringBean上下文*/ Component public class SpringBeanContext implements ApplicationContextAware {private static ApplicationContext context;Overridepublic void setApplicationContext(NonNull ApplicationContext applicationContext) throws BeansException {context applicationContext;}/*** 获取上下文** return 上下文对象*/public static ApplicationContext getContext() {return context;}/*** 根据beanName获取bean** param beanName bean名称* return bean对象*/public Object getBean(String beanName) {return context.getBean(beanName);}/*** 根据beanName和类型获取bean** param beanName bean名称* param clazz bean类型* param T bean类型* return bean对象*/public T T getBean(String beanName, ClassT clazz) {return context.getBean(beanName, clazz);}/*** 根据类型获取bean** param clazz bean类型* param T bean类型* return bean对象*/public T T getBean(ClassT clazz) {return context.getBean(clazz);} }解决效果 /*** 连接建立成功调用的方法** param session 可选的参数。session为与某个客户端的连接会话需要通过它来给客户端发送数据* param uid 用户id*/OnOpenpublic void onOpen(Session session, PathParam(uid) String uid) {try {RedisUtil bean SpringBeanContext.getContext().getBean(RedisUtil.class);bean.socketCache(uid, session);} catch (Exception e) {e.printStackTrace();}}这里我通过上下文类去获取到Bean对象然后测试连接成功了。 扩展知识 注意我这里有坑别踩着了我测试的适合数据还是写入失败了我这里是想将Socket的Session丢到Redis里面实现分布式环境对象共享(小小的尝试)。 bean.socketCache(uid, session);显然是不行的序列化会报错因为 看他的源码他没有去实现Serializable接口是不能被序列化的 好了此文结束下一篇小简来讲将分布式环境下WebSocket的同步问题吧
http://www.w-s-a.com/news/541606/

相关文章:

  • 整人关不掉的网站怎么做广东省网站免备案表
  • 网站设计素材edu域名网站
  • 中山学校的网站建设wordpress文章图片显示不出
  • 兰溪城市建设规划网站网站联盟的基本流程
  • 免费推广网站注册入口小说阅读网站怎么建设
  • 新网站怎么做网络推广怎么做企业网站排名
  • jsp商业网站开发网站链接如何做二维码
  • 江苏高校品牌专业建设网站怎么制作网站搜索窗口
  • 北京app建设 网站开发公司织梦网站seo
  • 大学网站 作风建设专题汽车配件外贸出口公司
  • 东莞做网站系统购物网站建设精英
  • 建设vip网站相关视频网站营销建设公司
  • 微站直播平台杭州seo按天计费
  • seo 新旧网站 两个域名福州设计网站建设
  • 如何做网站客户端如何做网络营销网站
  • 苏州网站建设制度打鱼网站建设
  • 瓜子二手车直卖网上海小红书seo
  • 天津中小企业网站制作珠海做网站的
  • 网站排名影响因素最牛的科技网站建设
  • 长春网站建设公司怎么样电商网站建设与开发期末考试
  • 品牌网站建设搭建国内外网站建设
  • 辽宁人社app一直更新整站seo定制
  • 兰州网站建设论坛装修品牌
  • 云南省城乡住房与建设厅网站用什么网站可以做电子书
  • 自己电脑怎么做网站服务器吗0基础如何做网站
  • 做网站的股哥网络整合营销方案策划
  • 网站你懂我意思正能量晚上唯品会网站开发费用
  • 网站认证金额怎么做分录网页无法访问是怎么回事
  • 樟木头建网站的wordpress自适应吸附菜单
  • 番禺网站设计威海微网站建设