2

Nettyのドキュメントを確認し、ソースクラスの例でいくつかのコメントを見つけました:org.jboss.netty.example.factorial.FactorialServerHandler、このsrcでは、いくつかのコメント:

    //##in org.jboss.netty.example.factorial.FactorialServerPipelineFactory
    ......
    // and then business logic.
    // Please note we create a handler for every new channel
    // because it has stateful properties.
    pipeline.addLast("handler", new FactorialServerHandler());

しかし、TelnetServerPipelineFactoryなどの他の例を再確認しても、違いはないようです。ハンドルは次のように作成されます。

    // and then business logic. 
    pipeline.addLast("handler", new TelnetServerHandler());

すべてのハンドラーは、「新規」のパイプラインによって作成されますか?そして、Nettyのすべての例はステートフルですか?明らかに、Echo/Telnetはステートフルな小道具を保持する必要はありません。

以前のプロジェクトでは、Nettyを使用してRESTfulサーバーとして機能するHttpサーバーを作成しました。ハンドラーコードは次のとおりです。

    public class HttpServerPipelineFactory  implements ChannelPipelineFactory {
        private final HttpServerHandler handler;
        public ChannelPipeline getPipeline() throws Exception {
            ChannelPipeline pipeline = pipeline();
            pipeline.addLast("decoder", new HttpRequestDecoder());
            pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
            pipeline.addLast("encoder", new HttpResponseEncoder());
            pipeline.addLast("handler", handler); //singleton
            return pipeline;
        }
    }

私のRESTfulサーバーはステートフルではない(これはREST意味の1つです)ので、シングルトンハンドルを使用しました。私は正しかったですか?

4

2 に答える 2

3

ドキュメントに「ステートフル」と記載されている場合は、状態情報がChannelHandlerのフィールドとして保存されているため、異なるチャネル間でChannelHandlerを共有できないことを意味します。フィールドとして保存されている状態情報がない場合は、Singeltonとして使用できます。

于 2012-04-23T05:52:11.457 に答える
1

ステートレスの場合、新しいハンドラーをインスタンス化する理由はありません。しかし、Httpの例では、これらのハンドラーステートフルです。それらはネットワークからフレームごとに受信し、ヘッダーなどに解析します。次に、リクエストがチャンク化されている場合、アグリゲーターはチャンクを単一のペイロードなどに結合します。要するに、エコーサーバーを構築していない限り、下位レベルのハンドラーはおそらくステートフルである必要がありますが、上位レベルはそうではありません。

于 2012-04-23T08:37:45.600 に答える