ChannelHandlerContext.attr не доступен изнутри userEventTriggered
Я использую Netty для разработки моего сервера. Я также реализую обработку состояния простоя в netty. Я получил это работает, но проблема, которую я недавно узнал. Я не могу получить доступ к атрибутам контекста канала внутри метода userEventTriggered. Вот мой код, и кто-нибудь может сказать мне, почему это невозможно.
Я устанавливаю это как
public static final AttributeKey<Agent> CLIENT_MAPPING = AttributeKey.valueOf("clientMapping");
...
ctx.attr(CLIENT_MAPPING).set(agent);
и внутри обработчика, я получаю значение как (это работает отлично)
Agent agent = ctx.attr(CLIENT_MAPPING).get();
Но внутри userEventTriggered он возвращает ноль. (Я уверен, что он установлен до вызова этой функции.)
public class Server
{
...
public void run() throws Exception
{
...
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup).
channel(NioServerSocketChannel.class).
childHandler(new SslServerInitializer());
...
}
}
class SslServerInitializer extends ChannelInitializer<SocketChannel>
{
@Override
public void initChannel(SocketChannel ch) throws Exception
{
ChannelPipeline pipeline = ch.pipeline();
....
pipeline.addLast("idleStateHandler", new IdleStateHandler(0, 0, Integer.parseInt(Main.configurations.get("netty.idleTimeKeepAlive.ms"))));
pipeline.addLast("idleTimeHandler", new ShelloidIdleTimeHandler());
}
}
class ShelloidIdleTimeHandler extends ChannelDuplexHandler
{
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception
{
if (evt instanceof IdleStateEvent)
{
try
{
// This I am getting null, but I confirmed that I set the attribute from my handler and is accessible inside handler.
Agent agt = ctx.attr(WebSocketSslServerHandler.CLIENT_MAPPING).get();
ctx.channel().writeAndFlush(new TextWebSocketFrame("{\"type\":\"PING\", \"userId\": \"" + agt.getUserId() + "\"}"));
}
catch (Exception ex)
{
ctx.disconnect();
ex.printStackTrace();
}
}
}
}
1 ответ
Решение
Вы уверены, что установите и получите его в том же ChannelHandler? Если вы хотите установить и получить его в другом ChannelHandler, вам нужно использовать Channel.attr(...)