package cn.gistack.by.nettyUpload;
|
|
|
import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
|
import cn.gistack.by.picUpload.service.BaiyiPicService;
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
import io.netty.channel.ChannelInitializer;
|
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.socket.SocketChannel;
|
import io.netty.handler.codec.http.HttpContentCompressor;
|
import io.netty.handler.codec.http.HttpObjectAggregator;
|
import io.netty.handler.codec.http.HttpRequestDecoder;
|
import io.netty.handler.codec.http.HttpResponseEncoder;
|
import io.netty.util.concurrent.DefaultEventExecutorGroup;
|
import io.netty.util.concurrent.EventExecutorGroup;
|
import io.netty.util.concurrent.RejectedExecutionHandler;
|
import io.netty.util.concurrent.SingleThreadEventExecutor;
|
import lombok.extern.slf4j.Slf4j;
|
import cn.gistack.resource.feign.IOssClient;
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import java.util.concurrent.ThreadFactory;
|
|
/**
|
*
|
* @author chenhaijian
|
* @date 2020-05-21 14:42
|
*/
|
@Slf4j
|
public class HttpUploadFileInitialzer extends ChannelInitializer<SocketChannel> {
|
/**
|
* 所有的工作线程的线程池。
|
*/
|
private static EventExecutorGroup executorGroup = null;
|
|
private NettyHttpConfig nettyHttpConfig;
|
|
|
private IOssClient iOssClient;
|
|
private BaiyiPicService baiyiPicService;
|
|
|
public HttpUploadFileInitialzer(NettyHttpConfig nettyHttpConfig,IOssClient iOssClient,BaiyiPicService baiyiPicService) {
|
this.nettyHttpConfig = nettyHttpConfig;
|
this.iOssClient = iOssClient;
|
this.baiyiPicService = baiyiPicService;
|
|
if (executorGroup == null) {
|
ThreadFactory threadFactory = (new ThreadFactoryBuilder()).setNameFormat("netty-business-%d")
|
.setDaemon(false).build();
|
executorGroup = new DefaultEventExecutorGroup(nettyHttpConfig.getBusinessThreadsCoreNum(), threadFactory,
|
nettyHttpConfig.getBusinessThreadsQueueCapacity(),
|
new RejectedExecutionHandler() {
|
@Override
|
public void rejected(Runnable runnable, SingleThreadEventExecutor singleThreadEventExecutor) {
|
log.error("Server will discard the runnale {}.", runnable.toString());
|
singleThreadEventExecutor.shutdownGracefully();
|
}
|
});
|
}
|
}
|
|
@Override
|
protected void initChannel(SocketChannel ch) throws Exception {
|
ChannelPipeline pipeline = ch.pipeline();
|
pipeline.addLast("decoder", new HttpRequestDecoder());
|
pipeline.addLast("encoder", new HttpResponseEncoder());
|
pipeline.addLast(new HttpContentCompressor());
|
// 聚合器,负责将http聚合成完整的消息,而不是原始的多个部分
|
pipeline.addLast(new HttpObjectAggregator(nettyHttpConfig.getMaxContentLength()));
|
pipeline.addLast(executorGroup, "httpUploadFileHandler", new HttpUploadFileHandler(nettyHttpConfig,iOssClient,baiyiPicService));
|
}
|
}
|