问题由来:

公司有个项目用到netty作为websocket的实现,最近打算部署双机,这使得原来在内存中的保存Channel信息的方案不再可行,需要转移到redis中,改造过程中发现通过@Autowired注入进来的JedisClient类无法使用,外部表现为jedisClient对象为null

解决过程:

1.一开始以为是spring配置引入先后顺序的问题,导致netty启动的时候jedisClient还没实例化好,调整后发现问题依旧

2.之后百度发现有不少人遇到这个问题,有回答说netty中无法使用注入的bean,需要主动通过getBean的方式来获取,这下问题基本上已经确定了,并不是配置的问题,而是因为WebSocketServerHandler是netty启动的时候new出来,并没有交给spring IOC托管

3.发现问题根源后找解决方法就很明朗了,最终的解决方法需要用到spring的两个注解@Component及@PostConstruct,

@Component大家都能熟悉了,就是把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class="">。泛指各种组件,比如类不属于@Controller或者@Service等时,就可以用该注解标注;

@PostConstruct这个注解是我第一次接触,在方法上加该注解会在项目启动的时候执行该方法,即spring容器初始化的时候执行,它与构造函数及@Autowired的执行顺序为:构造函数 >> @Autowired >> @PostConstruct,由此看来当我们想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于注入的bean,那么就无法在构造函数中实现,为此可以使用@PostConstruct注解一个init方法来完成初始化,该方法会在bean注入完成后被自动调用。

解决方案:

最终实现代码如下红色字体

public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> {

    @Autowired
private JedisClient jedisClient; private static WebSocketServerHandler webSocketServerHandler; @PostConstruct
public void init() {
webSocketServerHandler = this;
}
   ...此处省略其余代码...
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
webSocketServerHandler.jedisClient.get(...);
}
}

参数文章:

1.https://blog.csdn.net/u012138272/article/details/80502684

2.https://blog.csdn.net/qq_39851704/article/details/80392867

最新文章

  1. 详解tintColor属性
  2. SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)之间区别
  3. window.showModalDialog的简单实践
  4. iOS10 UI教程子视图和父视图UI层次结构和Views继承
  5. 怎么使用git来管理项目版本?
  6. iOS开发之数据存取3-CoreData自定义数据类型
  7. 第二百五十一天 how can I 坚持
  8. php之面向对象(2)
  9. Paint House II 解答
  10. jsp 页面取值
  11. PHP接入阿里云市场 阿里短信服务DEMO
  12. DirectSound---捕获音频、Qml/C++ 集成交互
  13. java的properties文件-jdbc优化编程(五)
  14. windows防火墙实验-命令行设置远程桌面连接以及禁止浏览器上网
  15. gitlab搭建和使用
  16. Docker Data Center系列(五)- 使用自定义的TLS安全认证
  17. Python之线程 2 - Python实现线程
  18. java.sql.SQLException: Field &#39;id&#39; doesn&#39;t have a default value(用eclipse操作数据库时报了这种奇怪的错误)的原因与解决方法
  19. MyBatis进阶(三)
  20. 完全背包记录路径poj1787 好题

热门文章

  1. Python 入门基础16 -- ATM + 购物车
  2. Android五种数据存储方式
  3. ROS中的CMakeLists.txt
  4. SVM较全面介绍,干货!(转载)
  5. Linux下clock计时函数学习
  6. vi与vim
  7. 026_关于shell中的特殊变量$0 $n $* $@ $! $?
  8. freerradius 错误:pap: WARNING: No &quot;known good&quot; password found for the user
  9. 利用navcat为mysql数据库单独的表赋权限及表结构同步
  10. PL/SQL第四章 where子语句