在Netty的Channel AttributeMap中存储DatagramPacket的远程地址是否安全?

时间:2017-04-06 19:29:03

标签: java netty

我有一个UDP入站连接。我需要在管道末端附近的ChannelHandler之一知道数据包发送方的地址。将它存储在频道的AttributeMap中是否安全/正确?或者,在我的处理程序可以处理之前,我是否冒险将一个数据包的值从后一个数据包中覆盖?或者有更好/标准的方法来做到这一点吗?

我在管道中的第一个处理程序基本上就是这样:

public class DatagramToBytesInboundChannelHandler
    extends MessageToMessageDecoder<DatagramPacket> {

    public static final AttributeKey<InetSocketAddress> REMOTE_ADDRESS = 
        AttributeKey.newInstance( "UdpRemoteAddress" );

    @Override
    protected void decode( ChannelHandlerContext ctx, DatagramPacket msg,
        List<Object> out ) throws Exception {
        ctx.channel().attr( REMOTE_ADDRESS ).set( msg.sender() );
        out.add( msg.content().copy() );
    }
}

然后在渠道处理程序中(有许多,我只是展示了一个感兴趣的)在管道中,我需要检索它:

public class MyChannelHandler extends 
    SimpleChannelInboundHandler<MyMessage> {

    @Override
    protected void channelRead0( ChannelHandlerContext ctx, MyMessage msg ) {
        InetSocketAddress remoteAddress = ctx.channel().attr(
            REMOTE_ADDRESS ).getAndSet( null );
        // Do things with the remote address
    }
}

如果我快速连续获得两个数据包,有一个风险,一个来自A,另一个来自B,当MyHandler正在处理来自A的消息时,它会看到来自B的地址吗?

对此的答案是否完全取决于我的Bootstrap配置?

0 个答案:

没有答案