Netty HttpChunckAggregator с состоянием -> условия гонки?

Может быть, это очевидный вопрос, но я слишком новичок с нетти.

Взглянув на класс 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, могу ли я получить условия гонки в случае фрагментированного сообщения и многопоточности?

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

2 ответа

Решение

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

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

Arun

Другие вопросы по тегам