gpt4 book ai didi

java - Spring 和 Netty

转载 作者:行者123 更新时间:2023-11-30 02:44:38 25 4
gpt4 key购买 nike

我有 Spring 和 Netty 的应用程序。问题是我试图以 Netty 的处理程序对于每个 channel 都是唯一的方式集成这两个框架。

因此,初始化 Netty 服务器的组件如下所示:

@Component
public class TCPServer {

...

@Autowired
@Qualifier("messageHandler")
private MessageHandler messageHandler;

private Channel serverChannel;

public void start() throws Exception {
logger.info("Starting TCP Server...");
ServerBootstrap b = new ServerBootstrap();
final EventExecutorGroup customGroup = new DefaultEventExecutorGroup(100);

b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(new Encoder());
pipeline.addLast(new Decoder());
pipeline.addLast(customGroup, messageHandler);
}
});
Set<ChannelOption<?>> keySet = tcpChannelOptions.keySet();
for (@SuppressWarnings("rawtypes") ChannelOption option : keySet) {
b.option(option, tcpChannelOptions.get(option));
}

serverChannel = b.bind(tcpPort).sync().channel();
logger.info("TCP Server started.");
}
...
}

和处理程序:

@Component 
@Sharable
public class MessageHandler extends SimpleChannelInboundHandler<Message> {

@Autowired
private ChannelRepository channelRepository;

private CommandUtil commandUtil;

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {

channelRepository.put(channelKey, ctx.channel());
commandUtil = new CommandUtil();
ctx.channel().attr(AttributeKey.valueOf("commands")).set(commandUtil);

}
...
}

这工作正常,但问题是 Netty 只创建 MessageHandler 类的一个实例,如果我替换注入(inject)的 MessageHandler 并每次都放置新实例( >new MessageHandler()) 我丢失了 Spring 上下文 - channelRepository 为 null。

问题是我如何为每个 channel 实现 MessageHandler 的新实例而不丢失 Spring 上下文(使用 Autowiring 字段)?

最佳答案

为您的消息处理程序创建一个工厂。将 ChannelRepository 注入(inject)您的工厂,并将工厂注入(inject)您的 ChannelInitializer (TCPServer)。

从 MessageHandler 中删除 @Sharable,这将防止您意外地在多个 channel 中使用同一个。仅当可以安全地跨 channel 共享相同的处理程序时,您才应添加此注释。

关于java - Spring 和 Netty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com