Netty Sharable Handler

@Sharable

对于@Sharable文档里面是这样说明的

对于这种用法指在多个ChannelPipeline中共享同一个ChannelHandler,对应的ChannelHandler必须要使用@Sharable注解标注;否则,试图将它添加到多个ChannelPipeline时将会触发异常。

@Sharable其实就是一个标识型的注解,可以认为我们标识这个ChannelHandler是线程安全的。

下面例子中ChannelInboundHandler1是无状态的,ChannelInboundHandler2是有状态的。ChannelInboundHandler1天然是线程安全的,我们在多个ChannelPipeline使用同一个Handler示例就可以减少对象的频繁创建和垃圾回收。如果想在多个ChannelPipeline中共享ChannelInboundHandler1实例就要将其标注为@Sharable,否则需要每次都new一个新的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 无状态
@ChannelHandler.Sharable
class ChannelInboundHandler1 extends ChannelInboundHandlerAdapter {
}

// 有状态
class ChannelInboundHandler2 extends ChannelInboundHandlerAdapter {
private ChannelHandlerContext ctx;

@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
this.ctx = ctx;
}
}

public class WebSocketChatServerInitializer extends ChannelInitializer<SocketChannel> {
private final ChannelInboundHandler1 channelInboundHandler1 = new ChannelInboundHandler1();

@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();

// channelInboundHandler1 线程安全的,多ChannelPipeline共享一个。
pipeline.addLast("channelInboundHandler1", channelInboundHandler1);
// channelInboundHandler1 非线程安全的,为每个ChannelPipeline都创建一个实例。
pipeline.addLast("channelInboundHandler2", new ChannelInboundHandler2());
}
}
本站采用「署名 4.0 国际」进行许可。