Netty与SpringBoot使用注意点

1. 注意在Encoder、Decoder、Handler中使用注入

@Resource
private AuthHandler authHandle

ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new StringDecoder());
                            ch.pipeline().addLast(new NtripDecode());
                            ch.pipeline().addLast(authHandler);
                        }
                    })

在ch.pipeline().addLast的时候,里面填入的参数不能是交给Spring管理的类,因为每次连接过来时,都需要重新new,因此该类中的参数也无法使用@Autowired与@Resouce这类注解。
若采用以上的方式,就会报以下错误:

io.netty.channel.ChannelPipelineException: com.cnostar.cloud.gateway.ntrip.handler.AuthHandler is not a @Sharable handler, so can't be added or removed multiple times.

若需要在这些类中需要使用到注入的参数怎么办,可以采用类似以下方式,用一个静态类进行管理:

@Configuration
public class SpringBeanManager {


    private static AuthFeignService authFeignService;

    @Autowired
    public void setAuthFeignService(AuthFeignService authFeignService) {
        SpringBeanManager.authFeignService = authFeignService;
    }

    public static AuthFeignService getAuthFeignService() {
        return authFeignService;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要让NettySpring Boot应用共享一个端口,可以使用Spring Boot自带的Tomcat容器,然后使用Netty作为Tomcat容器的嵌入式容器。以下是实现步骤: 1. 在Spring Boot项目中添加Netty的依赖: ``` <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.30.Final</version> </dependency> ``` 2. 创建一个NettyServer类,用于启动Netty服务: ```java @Component public class NettyServer { private EventLoopGroup bossGroup; private EventLoopGroup workerGroup; private ServerBootstrap serverBootstrap; public void start(int port) throws InterruptedException { bossGroup = new NioEventLoopGroup(); workerGroup = new NioEventLoopGroup(); serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new NettyServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } public void stop() { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } ``` 其中,NettyServerHandler是自定义的处理器,用于处理Netty服务收到的请求。 3. 在Spring Boot应用的启动类中,将NettyServer作为一个Bean注入: ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public NettyServer nettyServer() { return new NettyServer(); } } ``` 4. 在Controller中,添加一个请求处理方法,用于测试Netty服务: ```java @RestController public class TestController { @Autowired private NettyServer nettyServer; @GetMapping("/test") public String test() throws InterruptedException { nettyServer.start(8080); return "Test Netty Server!"; } } ``` 5. 启动Spring Boot应用,访问http://localhost:8080/test,即可测试Netty服务是否正常启动。 这样,就可以让NettySpring Boot应用共用一个端口了。注意,这种方式只适用于开发环境,生产环境下不建议这样做。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值