is not a@Sharable handler解決方法

979 ワード

昨日エンコーダを書いた時はspringと統合していたので、コードを使った時にAutowiredで自動注入
@Autowired
private ProtocolDecoder protocolDecoder ;

@Autowired
private ProtocolEncoder protocolEncoder;

その結果、複数のクライアントが接続されている(実際にはマルチクライアントの問題ではない)場合、次のようにエラーが発生します.
io.netty.channel.ChannelPipelineException: com.sim.server.game.net.coder.decoder.ProtocolDecoder is not a @Sharable handler, so can't be added or removed multiple times.

そこで私は自業自得でProtocolDecoderに@Sharable注釈を付けたが、起動時にエラーを報告した.
Caused by: java.lang.IllegalStateException: ChannelHandler com.sim.server.game.net.coder.decoder.ProtocolDecoder is not allowed to be shared

最後の解決策は、単一の例を使用しないで、handlerを追加するたびに直接new
        pipeline.addLast("decoder",new ProtocolDecoder() );
        pipeline.addLast("encoder",new ProtocolEncoder()) ;

もちろんChannelInitializerのサブクラスでis not a@Sharable handlerと間違えている場合は、一般的に@Sharable注記を付けるとよい.