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(...)

Другие вопросы по тегам