0
点赞
收藏
分享

微信扫一扫

Netty多线程配置机制

未定义变量 2022-12-07 阅读 88


技术点描述

本文主要是对前一节(Netty多线程机制)中的一些未提及的有用的类(可控制可配置类)做进一步解释说明,由于NIO包和OIO包中类比较多,此文仅介绍与多线程相关的且有对外开放接口的类进行分析。

NIO包结构如下图所示:

本文档主要讲解此包中的

DefaultNioDatagramChannelConfig类、

NioDatagramChannelConfig接口、

NioSocketChannelConfig接口

 

OIO包结构如下图所示:

此包中的类各种功能与NIO包中的类的功能类似,只是适用于old I/O,添加了多播模式的支持。

参考源码包

以下是对类的具体说明以及重要的常用的方法的分析

DefaultNioDatagramChannelConfig

此类是接口NioDatagramChannelConfig的实现类,具体的使用方法参见3.2.NioDatagramChannelConfig接口分析

NioDatagramChannelConfig

为新的I/O(new I/O) TCP/IP协议提供数据报管道配置,主要是配置DatagramChannel的参数的。以下是一些常用的参数:

 

 

 

 

 


Name

Associated setter method

"writeBufferHighWaterMark"

默认 64 * 1024(用法未知

"writeBufferLowWaterMark"

默认 32 * 1024(用法未知

"writeSpinCount"

默认 16(重复写次数,用法未知

"broadcast"

true / false 多播模式(UDP适用)

"interface"

多播数据包的网络接口地址

"loopbackModeDisabled"

实际调用的是channel.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, loopbackModeDisabled);仅针对JDK7+有效

"networkInterface"

实际调用的是channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface);仅针对JDK7+有效

"reuseAddress"

地址是否可复用(UDP socket address绑定时用到)

"receiveBufferSize"

数据包接收大小

"receiveBufferSizePredictor"

数据包接收大小:默认设置为FixedReceiveBufferSizePredictor(768),超过后丢弃

"receiveBufferSizePredictorFactory"

似乎与上面的功能相同,设置方式:new FixedReceiveBufferSizePredictorFactory(1024)

"sendBufferSize"

发送数据包大小

"timeToLive"

JDK7+版本有效

"trafficClass"

0<=tc<=255

bufferFactory"

用于创建ChannelBuffer的工厂,默认HeapChannelBufferFactory

"connectTimeoutMillis"

连接超时时间(毫秒)

"pipelineFactory"

仅适用于child channel 创建时有效

"keepAlive"

启用/禁用Nagle算法

"soLinger"

Socket关闭时的延迟时间(单位:秒)

"tcpNoDelay"

启用/禁用Nagle算法


 

 

 

NioSocketChannelConfig

具体配置查看3.2 NioDatagramChannelConfig

Demo实现

SocketSetver 
public static void tcpServerStartUp() {
TCPSERVER_BOOTSTRAP.setPipelineFactory(new TCPServerPipelineFactory(EXECUTION_UP_HANDLER,EXECUTION_DOWN_HANDLER));
// TCPSERVER_BOOTSTRAP.setOption("child.tcpNoDelay", true);
// TCPSERVER_BOOTSTRAP.setOption("child.keepAlive", true);
// TCPSERVER_BOOTSTRAP.setOption("reuseAddress", true);
// LOGGER.info("SERVER_NAME:"+Constants.SERVER_NAME);
// LOGGER.info("TCPSERVER_PORT:"+Constants.TCPSERVER_PORT);
// TCPSERVER_BOOTSTRAP.bind(new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
TCPSERVER_BOOTSTRAP.setOptions(Constants.CHANNEL_CONFIGER_MAP);
TCPSERVER_BOOTSTRAP.bind();
LOGGER.info("TCP服务已启动....");
Constants

CHANNEL_CONFIGER_MAP.put("writeBufferHighWaterMark", 64*1024);
CHANNEL_CONFIGER_MAP.put("writeBufferLowWaterMark", 32*1024);
CHANNEL_CONFIGER_MAP.put("writeSpinCount", 16);
CHANNEL_CONFIGER_MAP.put("broadcast", true);
CHANNEL_CONFIGER_MAP.put("interface", new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
CHANNEL_CONFIGER_MAP.put("loopbackModeDisabled", true);
CHANNEL_CONFIGER_MAP.put("networkInterface", new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
CHANNEL_CONFIGER_MAP.put("localAddress", new InetSocketAddress(Constants.SERVER_NAME,Constants.TCPSERVER_PORT));
CHANNEL_CONFIGER_MAP.put("reuseAddress", true);
CHANNEL_CONFIGER_MAP.put("receiveBufferSize", 10000);
CHANNEL_CONFIGER_MAP.put("receiveBufferSizePredictor", new FixedReceiveBufferSizePredictor(100000));
CHANNEL_CONFIGER_MAP.put("receiveBufferSizePredictorFactory", new FixedReceiveBufferSizePredictorFactory(100000));
CHANNEL_CONFIGER_MAP.put("sendBufferSize", 10000);
CHANNEL_CONFIGER_MAP.put("timeToLive", 30);
CHANNEL_CONFIGER_MAP.put("trafficClass", 100);
CHANNEL_CONFIGER_MAP.put("bufferFactory", new HeapChannelBufferFactory());
CHANNEL_CONFIGER_MAP.put("connectTimeoutMillis", 60000);
CHANNEL_CONFIGER_MAP.put("pipelineFactory", new TCPServerPipelineFactory(new ExecutionHandler(
new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576),false,true), new ExecutionHandler(
new OrderedDownstreamThreadPoolExecutor(16),true,false)));

举报

相关推荐

0 条评论