我有一个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
配置?