Netty HttpChunckAggregator с сохранением состояния --› условия гонки?

Может быть, это очевидный вопрос, но я слишком новичок в 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;
}

и сервер NIO Netty, могу ли я получить условия гонки в случае фрагментированного сообщения и многопоточности?

Я вижу, что каждый новый канал создает новый агрегатор чанков, но... все сообщения чанков будут получены в одном и том же канале?


person Curro    schedule 02.08.2012    source источник


Ответы (2)


Это безопасно, так как оно не используется разными каналами. В netty только один поток выполняет восходящие события, поэтому безопасно хранить состояния в полях без какой-либо синхронизации, если они не доступны/не изменяются из нижестоящего события.

person Norman Maurer    schedule 02.08.2012

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;
}

Арун

person arun_gopalan    schedule 16.04.2013