1

たぶんこれは明らかな質問ですが、私はnettyに慣れていません。

HttpChunckAggregatorクラスを見ると、ステートフルであることがわかります。それは私を疑わせます...次のパイプラインを持つ特定のチャネルを考えると:

private MyServerHandler handler;

public ChannelPipeline getPipeline() throws Exception {
    ChannelPipeline pipeline = pipeline();                   
    pipeline.addLast("decoder",new HttpRequestDecoder());       
    pipeline.addLast("chunkAggregator",new HttpChunkAggregator(4194304));       
    pipeline.addLast("encoder",new HttpResponseEncoder());              
    pipeline.addLast("chunkSeparator",new HttpChunkSeparator(4194304));         
    pipeline.addLast("handler", handler); //Singleton       
    return pipeline;
}

およびNIONettyサーバーの場合、チャンク化されたメッセージとマルチスレッドの場合に競合状態を取得できますか?

すべての新しいチャネルが新しいチャンクアグリゲーターを作成するのがわかりますが...すべてのチャンクメッセージは同じチャネルで受信されますか?

4

2 に答える 2

1

異なるチャネルで共有されていないため、安全です。nettyでは、1つのスレッドのみがアップストリームイベントを実行しているため、ダウンストリームイベントからアクセス/変更されない限り、同期せずにフィールドに状態を安全に保存できます。

于 2012-08-02T12:11:52.077 に答える
1

getPipelineは、着信メッセージごとに呼び出されます。したがって、HttpRequestごとに、新しいHttpChunkSeparatorを作成します。

ただし、このようなことを行った場合、それは完全にスレッドセーフではありません。

private MyServerHandler handler;

// THIS IS WRONG AS getPipeline() will keep giving the same instance to multiple threads.
private HttpChunkAggregator httpChunkAggregator;

public ChannelPipeline getPipeline() throws Exception {
    ChannelPipeline pipeline = pipeline();                   
    pipeline.addLast("decoder",new HttpRequestDecoder()); 

    // This is WRONG. DO NO DO THIS. INSTEAD DO new HttpChunkAggregator().      
    pipeline.addLast("chunkAggregator",httpChunkAggregator);      

    pipeline.addLast("encoder",new HttpResponseEncoder());              
    pipeline.addLast("chunkSeparator",new HttpChunkSeparator(4194304));         
    pipeline.addLast("handler", handler); //Singleton       
    return pipeline;
}

アルン

于 2013-04-16T14:45:16.333 に答える