我正在研究一个netty通道处理程序/解码器,它为每个到达处理程序的消息分配一个唯一的序列号。
我当前的方法定义了一个将AtomicLong作为计数器的属性,每当消息到达时,它会加1并分配给解码的消息:
@Override
protected void decode(ChannelHandlerContext ctx, TextWebSocketFrame frame, List<Object> out) {
AttributeKey<AtomicLong> sequenceKey = AttributeKey.valueOf("message_sequence");
AtomicLong sequence = ctx.channel().attr(sequenceKey).get();
long curerntMessageId = sequence.incrementAndGet();
Message message = decode(frame);
message.setMessageId(curerntMessageId);
稍后,在消息编码器中,消息ID被传送到响应消息,从而通过唯一ID连接请求和响应。
采用这种方法的原因是,在Web套接字连接的上下文中,我需要一些机制来识别请求&lt; - &gt;响应周期。
我想知道这种方法是否有意义,因为我必须一直访问频道属性,或者是否已经有现有的解决方案,我可能不知道?
答案 0 :(得分:1)
如果每个连接只需要唯一,你可以直接在解码器本身存储一个int / long并递增它。这适用于所有内容都是单线程的。因此,如果我正确理解你的用例,就没有必要使用属性和原子