无法从userEventTriggered中访问ChannelHandlerContext.attr

时间:2014-05-17 09:29:15

标签: java netty keep-alive

我正在使用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中,它返回null。 (我确信在调用此函数之前已设置它。)

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 个答案:

答案 0 :(得分:0)

您确定在相同的ChannelHandler中设置并获取它吗?如果你想在不同的ChannelHandler中设置并获取它,你需要使用Channel.attr(...)