Spring Boot整合Netty(二):注入Service

1、添加依赖

 1.          <!--netty-->

2. <dependency>

3. <groupId>io.netty</groupId>

4. <artifactId>netty-all</artifactId>

5. <version>4.1.24.Final</version>

6. <scope>compile</scope>

7. </dependency>

2、创建TcpServer

 2.  @Slf4j

3. @Component

4. @Order(value = 1)

5. public class TcpServer implements CommandLineRunner {


7. @Value("${netty.ip}")

8. private String ip;


10. @Value("${netty.port}")

11. private int tcpPort;


13. @Autowired

14. private ProduceOrderService produceOrderService;


16. @Autowired

17. private TestRecordTopService testRecordTopService;


19. @Autowired

20. private TestRecordAllService testRecordAllService;


22. @Autowired

23. private ProduceOrderLogService produceOrderLogService;


25. @Async

26. @Override

27. public void run(String... args) {

28. start(ip, tcpPort);

29. }


31. public void start(String ip, int port) {

32. // master reactor

33. EventLoopGroup bossGroup = new NioEventLoopGroup();

34. // sub reactor

35. EventLoopGroup workGroup = new NioEventLoopGroup();


37. ChannelFuture f;

38. try {

39. // start

40. ServerBootstrap bootstrap = new ServerBootstrap();

41. // install NioEventLoopGroup

42. bootstrap.group(bossGroup, workGroup)

43. // set channel type NIO

44. .channel(NioServerSocketChannel.class)

45. // set connect params

46. .option(ChannelOption.SO_BACKLOG, 1024)

47. .childOption(ChannelOption.SO_KEEPALIVE, true)

48. .childOption(ChannelOption.TCP_NODELAY, true)

49. // set in/out event handler

50. .childHandler(new ChannelInitializer<NioSocketChannel>() {

51. @Override

52. protected void initChannel(NioSocketChannel ch) {

53. // 添加分隔符解码器

54. ch.pipeline().addFirst(new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Unpooled.copiedBuffer("&&".getBytes())));

55. ch.pipeline().addLast(new TcpMsgOutHandler());

56. ch.pipeline().addLast(new TcpActiveHandler());

57. ch.pipeline().addLast(new TcpMsgInHandler(produceOrderService, testRecordTopService, testRecordAllService, produceOrderLogService));

58. }

59. });

60. // bind port

61. f = bootstrap.bind(ip, port).sync();

62. if (f.isSuccess()) {

63. log.info("start tcp server success: {}", port);

64. } else {

65. log.warn("start tcp server failed: {}", f.cause().getMessage());

66. }

67. f.channel().closeFuture().sync();

68. } catch (Exception e) {

69. log.error("start tcp server error: {}", e.getMessage());

70. } finally {

71. workGroup.shutdownGracefully();

72. bossGroup.shutdownGracefully();

73. }

74. }

75. }

3、Handler



1. @Slf4j

2. @ChannelHandler.Sharable

3. public class TcpActiveHandler extends ChannelInboundHandlerAdapter {


5. private final static AtomicLong activeCount = new AtomicLong(0);


7. @Override

8. public void channelActive(ChannelHandlerContext ctx) {

9. log.info("active client count: {}", activeCount.addAndGet(1));

10. }


12. @Override

13. public void channelInactive(ChannelHandlerContext ctx) {

14. log.info("active client count: {}", activeCount.decrementAndGet());

15. }


17. }





1. public class TcpMsgOutHandler extends ChannelOutboundHandlerAdapter {


3. @Override

4. public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {

5. ctx.writeAndFlush(Unpooled.copiedBuffer(((String) msg).getBytes(StandardCharsets.UTF_8)));

6. }

7. }



netty+4G DTU
zip 0星
超过10%的资源
76KB

下载

 2.  @Slf4j

3. public class TcpMsgInHandler extends ChannelInboundHandlerAdapter {


5. private final ProduceOrderService produceOrderService;

6. private final TestRecordTopService testRecordTopService;

7. private final TestRecordAllService testRecordAllService;

8. private final ProduceOrderLogService produceOrderLogService;


10. public TcpMsgInHandler(ProduceOrderService produceOrderService, TestRecordTopService testRecordTopService,

11. TestRecordAllService testRecordAllService,ProduceOrderLogService produceOrderLogService) {

12. this.produceOrderService = produceOrderService;

13. this.testRecordTopService = testRecordTopService;

14. this.testRecordAllService = testRecordAllService;

15. this.produceOrderLogService = produceOrderLogService;

16. }


18. @Override

19. public void channelActive(ChannelHandlerContext ctx) {

20. log.info("client active: {}", ctx.channel().remoteAddress());

21. }


23. @Override

24. public void channelInactive(ChannelHandlerContext ctx) {

25. log.info("client inactive: {}", ctx.channel().remoteAddress());

26. }


28. @Override

29. public void channelRead(ChannelHandlerContext ctx, Object msg) {

30. ByteBuf byteBuf = (ByteBuf) msg;

31. String readMsg = byteBuf.toString(CharsetUtil.UTF_8);

32. ProduceMsg produceMsg = null;

33. try {

34. produceMsg = JSONObject.parseObject(readMsg, ProduceMsg.class);

35. } catch (Exception e) {

36. log.error("ProduceMsg 格式化消息失败!{}", e.getMessage());

37. ctx.write(ERROR_FORMAT_MSG);

38. }


40. if (produceMsg != null) {

41. log.info("Client Msg: {}", produceMsg);

42. TestRecordTopVO testRecordTopVO;

43. String msgType = produceMsg.getMsgType();

44. String msgContent = produceMsg.getMsgContent();

45. switch (msgType) {

46. // 通过IMEI号获取订单信息

47. case FIND_PRODUCE_ORDER_INFO:

48. ProduceOrderVO produceOrderVO = produceOrderService.queryProduceOrder(msgContent);

49. if (produceOrderVO == null) {

50. ctx.write(ERROR_RECORD_NOT_EXIST);

51. } else {

52. ctx.write(JSONObject.toJSONString(produceOrderVO));

53. }

54. break;

55. case SAVE_PRODUCE_DATA:


57. break;

58. case SAVE_PRODUCE_LOG:


60. break;

61. case PRODUCT_OUTBOUND:


63. break;

64. case GET_METER_CODE:


66. break;

67. case FIND_PRODUCE_RECORD_BY_IMEI:


69. break;

70. case FIND_PRODUCE_RECORD_BY_METER_CODE:


72. break;

73. default:

74. log.error("消息不存在!");

75. }

76. }


78. }


80. @Override

81. public void channelReadComplete(ChannelHandlerContext ctx) {

82. ctx.flush();

83. }


85. @Override

86. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

87. log.error("client {} exception: {}", ctx.channel().remoteAddress(), cause);

88. }

89. }

L丶cz

关注

  • 0

  • 0

  • 0

专栏目录

netty无法导入注入Bean问题解决

weixin_41144975的博客

470

这个问题和weboscket一样 * 因 Spring**Boot WebSocket 对每个客户端连接都会创建一个 WebSocketServer@ServerEndpoint 注解对应的 对象,Bean 注入操作会被直接略过,因而手动注入一个全局变量,spring管理的都是单对象,和Websocket 多对象相冲突。 同理 netty也是多对象,spring无法管理 解决方法: 网上出现较…

Netty注入**Spring成份

石磊的博客

781

Netty注入**Spring成份

评论

写评论

spring boot集成netty**注入bean_阔乐猫的博客

6-6

主要代码 启动netty 解码 要点: 1.再要注入bean的类上加上**@Component** 2.spring默认创建的对像是单例的,所以要使用**@Scope(“prototype”)** 每次获取对象都会创建新的对象,不然netty只能创建一个连接,当创建多个的时候报so …

…无法注入bean的问题解决_shu010的博客_netty 注入bean

7-29

作者在使用netty集成spring**注入调用时普通的@Autowired一直bean注入为null,这里我只是记录针对netty注入spring无法注入bean的解决发放,具体底层实现,希望大神不吝赐教 首先上解决代码块,copy过去就可以直接用 …

Netty-4 无法依赖注入**Services

qq_41850449的博客

715

今天博主在写数据库的时候遇到一个问题 @ChannelHandler.Sharable public class TcpHandler extends ChannelInboundHandlerAdapter { @Autowired private FormRepository formRepository; //这个借口注入不来啊!气 @Override public void c…

大牛深入讲解!9000字通俗易懂的讲解下Java注解,赶紧学起来

179

前言 在大型系统中,为了减少数据库压力通常会引入缓存机制,一旦引入缓存又很容易造成缓存和数据库数据不一致,导致用户看到的是旧数据。 为了减少数据不一致的情况,更新缓存和数据库的机制显得尤为重要,接下来带领大家踩踩坑。 直击面试 反正我是带着这些问题往下读的 说一下 JVM 运行时数据区吧,都有哪些区?分别是干什么的? Java 8 的内存分代改进 举例栈溢出的情况? 调整栈大小,就能保存不出现溢出吗? 分配的栈内存越大越好吗? 垃圾回收是否会涉及到虚拟机栈? 方法中定义的局部变量是否线程安全? 运行时

Netty handler无法进行依赖注入的问题_蝉 沐 风的博客…

5-20

使用Netty作为服务端程序时,遇到handler无法进行依赖注入的问题,代码如下:@Slf4jpublic class NettyServerHandler extends ChannelInboundHandlerAdapter { //注入失败,获取值为null @Autowired XxService xxService; //…忽略…

Netty 为handler注入服务接口_勤奋的Mr.Li的博客

5-8

问题: 在Spring项目中我们总是习惯性的为要交给Spring托管的bean加上类注解@Component/@Service等,然后在使用其的地方使用@AutoWired/@Resource等注解注入实例. 然而Netty的handler是netty启动的时候new出来,并没有交给spring IOC托管,直接用…

@service注解_解决websocket和netty中无法注入**service

weixin_39641876的博客

252

首先,目前我的项目是spring**boot+netty,在netty-client中注入service,但是在调用service的时候一直报null空指针异常。刚开始实验了N次还是无法解决这个问题,以为是自己的写法问题,并没有想到是service无法实例化的问题,后来通过度娘,才找到了解决方法。方法如下将websocket或者netty交给spring管理(在类上加上 @Component注解)…

Netty Handler无法依赖注入 注入**service对象失败

梦里蓝天

317

@Component //第一步 加入spring容器 public class FpgaScoketServerHandler extends SimpleChannelInboundHandler<String>{ public static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); @Autowired //第步 把dao加载进来

深度解读Netty:自定义组件如何注入**Spring底层的组件_普…

6-3

Java程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、…

netty整合spring**boot无法注入bean的问题

祥哥

482

原因分析,是因为没有遵守spring的依赖注入规则,对象不能通过new来实体化 决绝如下 1. netty的server主类添加@Component注解, 2. handler通过注解注入,不能new 3. handler处理类必须添加@Component注解 …

Spring**Boot+Netty+Websocket整合案例3分钟实现一个基本的聊天功能

程序员闪充宝

1403

作者愚公要移山www.toutiao.com/i6775018273139327492/之前使用Springboot整合了websocket,实现了一个后端向前端推送信息的基本小案例,…

Spring Boot + Netty 中 @Autowired, @Value 为空解决

weixin_33768481的博客

487

问题描述 使用 Spring Boot + Netty 新建项目时 Handler 中的 @Autowired, @Value 注解的始终为空值 解决方法 @Component // 1. 添加 @Component 注解 public class TestHandler extends ChannelInboundHandlerAdapter { private static Test…

Spring**Boot集成Netty时在Handler类中注入**service和dao为null

人生最遗憾的莫过于:轻易地放弃了不该放弃的,固执地坚持了不该坚持的

5242

最近在做一个服务器接收客户端消息,之前一直都只接触web开发,第一次接触服务器开发,接触到Netty,但在Netty的Handler类里注入为null。 public class HttpRequestHandler extends SimpleChannelInboundHandler<FullHttpRequest> { @Autowired private U…

spring的@Autowired注入无法实例化service问题解决(**netty处理类无法实例化service**)
热门推荐

434494584_磊

1万+

首先目前我写的项目是spring**boot+netty,在接收客户端传输的数据时调用service一直报null指针异常  刚开始没有想到是service无法实例化的问题,一直在测试数据方面的问题,后来去群里讨论才知道问题所在  我这里讲的netty接收数据的handler类,但是基本都大同小异  如果我们直接在一个不是controller类的里面注入@Autowired的时候,而且还去调用就会…

主动获取spring容器工具类SpringContextUtil

飞翔中的菜鸟

8239

/** * 获取spring容器,以访问容器中定义的其他bean */ @Component public class SpringContextUtil implements ApplicationContextAware { // Spring应用上下文环境 @Autowired private ApplicationContext applicationCont

关于nettyspring对象注入失败的问题

TIANTIANDOUNITIAN的博客

1553

今天在做项目的时候发现在netty注入**service失败,百度许久后也找不到答案(@Component,@PostConstruct)未起作用,后灵光一现,发现了问题所在: 如图:         这些地方都必须通过spring**注入才能实现其他依赖注入,之前这里都是采用new的,所以导致spring**注入失败…

Netty handler无法进行依赖注入的问题

跑码场

867

使用Netty作为服务端程序时,遇到handler无法进行依赖注入的问题,代码如下 @Slf4j public class NettyServerHandler extends ChannelInboundHandlerAdapter { //注入失败,获取值为null @Autowired XxService xxService; //……….忽略其他程序 } 解决方法如下及原理如下 @Component //第1步 public class Server

Spring Boot 整合 Netty服务
最新发布

woaiwojialanxi的专栏

735

Spring Boot 整合 Netty服务

【BUG解决】Spring boot 中Handler,Filter注入 Service、Repositoy为null

aresblank的博客

286

新建 springBeanUtil.java import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @autho.

netty学习—-spring整合netty无法注入bean的问题解决

8080

3735

作者在使用netty集成spring**注入调用时普通的@Autowired一直bean注入为null,这里我只是记录针对netty注入spring无法注入bean的解决发放,具体底层实现,希望大神不吝赐教 首先上解决代码块,copy过去就可以直接用 @Component public class NettyWebSocketServerHandler extends SimpleChannel…

Java使用final构造器注入方式更安全

蜜桃先生的博客

3104

普通玩家 private final UserRepository userRepository; public UserResource(UserRepository userRepository) { this.userRepository= userRepository; } 高级玩家 添加在类上 @RequiredArgsConstructor(onConstructor = @__(@Autowired)) final注入 private final UserValidator

Netty中注解使用Service或者Mapper

楊杰的博客

2501

Spring**Boot搭配Netty使用,在Handler中注解使用Service/Mapper 一直 为null。起初使用 Spring**Boot启动类继承ApplicationContextAware,再写一个静态方法获取Bean来解决。放在服务器上跑了几个小时就出现了问题,好像是该方案造成的。另辟蹊径,再看网上给出的答案,因为 Handler 是 new出来的,不被Spring管理,所以注…

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助

©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

L丶cz

码龄8年 杭州为峰科技技术有限公司

24
原创

109万+
周排名

17万+
总排名

1万+

访问

等级

265

积分

6

粉丝

12

获赞

10

评论

21

收藏

私信

关注

热门文章

分类专栏

最新评论

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐

最新文章

2021年24篇

举报

×

拖拽到此处

图片将完成下载