核心配置
核心框架的主要配置点是传输实例(Transport instances)及其关联的线程池(thread pools)。通过 NIOTransportBuilder 可以配置这两个实体。
传输配置
正如有针对TCP和UDP的具体 NIOTransport 实现一样,也有两种具体的 NIOTransportBuilder 实现。
每个 NIOTransportBuilder 实现都公开了每种传输所独有的可配置功能。以下内容描述了所有 NIOTransports 共有的配置属性,
然后描述了 TCP 和 UDP NIOTransport 实现的属性。
NIOTransportBuilder属性
NIOTransportBuilder属性 | 描述 |
---|
workerThreadPoolConfig | 此属性公开ThreadPoolConfig实例,该实例允许配置将由此构建器构造的传输使用的工作线程池(work thread pool)。注意:根据所使用的IOStrategy,此值可以为null。 |
selectorThreadPoolConfig | 此属性公开了ThreadPoolConfig实例,该实例允许配置将由此构建器构造的传输使用的选择器/内核线程池。(selector/kernel thread pool) |
IOStrategy | 设置此传输将使用的IOStrategy。请注意,在开始传输之前更改此值可能会对workerThreadPoolConfig属性的返回值产生影响。如果未显式设置任何值,则将使用WorkerThreadIOStrategy。有关Grizzly 2.3随附的每个具体IOStrategy的详细信息,请参见IOStrategies的部分。 |
memoryManager | 设置此传输使用的MemoryManager。如果未显式设置任何值,则使用的MemoryManager将为NIOTransportBuilder.DEFAULT_MEMORY_MANAGER。有关MemoryManager系统的详细信息,请参阅“内存管理”部分。 |
selectorHandler | 设置此传输使用的SelectorHandler。如果未显式设置任何值,则使用的SelectorHandler将是NIOTransportBuilder.DEFAULT_SELECTOR_HANDLER。有关SelectorHandler的详细信息,请参见“传输和连接”部分。 |
selectionKeyHandler | 设置此传输要使用的SelectionKeyHandler。如果未显式设置任何值,则使用的SelectionKeyHandler将为NIOTransportBuilder.DEFAULT_SELECTION_KEY_HANDLER。有关SelectionKeyHandler的详细信息,请参见“传输和连接”部分。 |
attributeBuilder | 设置此传输使用的AttributeBuilder。如果未显式设置任何值,则使用的AttributeBuilder将为NIOTransportBuilder.DEFAULT_ATTRIBUTE_BUILDER。 |
NIOChannelDistributor | 设置此传输使用的NIOChannelDistributor。有关NIOChannelDistributor的详细信息,请参见“传输和连接”部分。 |
processor | 设置此传输使用的处理器。 |
processorSelector | 设置此传输使用的ProcessorSelector。 |
readBufferSize | 设置每个连接分配的缓冲区大小,以读取传入数据。 |
writeBuffersSize | 设置每次连接将应用的缓冲区大小,以写入传出数据。 |
TCPNIOTransportBuilder属性
TCPNIOTransportBuilder属性 | 描述 |
---|
clientSocketSoTimeout | 以毫秒为单位(客户端模式),SO_TIMEOUT 以指定的超时 enable/disable SO_TIMEOUT。 |
connectionTimeout | 在建立连接之前可能花费的时间,超时时间(以毫秒为单位)。 |
keepAlive | Enable/disable SO_KEEPALIVE. |
linger | 使用指定的延迟时间(以秒为单位)启用/禁用SO_LINGER。最大超时值(maximum timeout value)是特定于平台的。该设置仅影响套接字关闭。 |
reuseAddress | 启用/禁用SO_REUSEADDR套接字选项。当TCP连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为TIME_WAIT状态或2MSL等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果在超时状态下存在涉及套接字地址或端口的连接,则可能无法将套接字绑定到所需的SocketAddress。 |
serverConnectionBacklog | 指定最大未建立连接队列长度。 |
serverSocketSoTimeout | 以指定的时间 Enable/disable SO_TIMEOUT,以毫秒为单位(服务器模式) |
tcpNoDelay | 启用/禁用TCP_NODELAY(禁用/启用Nagle算法)。 |
temporarySelectorIO | 允许指定TemporarySelectorIO实例,以帮助模拟阻塞IO。 |
optimizedForMultiplexing | 控制写入连接的行为。如果启用,则无论当前线程是否可以直接写入连接,所有写入都将传递到异步写入队列。当实际发生写入时,传输将尝试从写入队列中写入尽可能多的内容。默认情况下禁用此选项。 |
maxAsyncWriteQueueSizeInBytes | 指定基于每个连接的异步写入队列的大小(以字节为单位)。如果未指定,则该值将配置为系统套接字写缓冲区大小的四倍。将此值设置为-1将使队列不受限制。 |
UDPNIOTransportBuilder属性
UDPNIOTransportBuilder属性 | 描述 |
---|
connectionTimeout | 在操作超时之前建立连接可能花费的时间(以毫秒为单位)。 |
reuseAddress | 启用/禁用SO_REUSEADDR套接字选项。当TCP连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为TIME_WAIT状态或2MSL等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果在超时状态下存在涉及套接字地址或端口的连接,则可能无法将套接字绑定到所需的SocketAddress。 |
temporarySelectorIO | 允许指定TemporarySelectorIO实例,以帮助模拟阻塞IO。 |
线程池配置
Grizzly的线程池配置由ThreadPoolConfig对象管理:
ThreadPoolConfig属性 | 描述 |
---|
queue | 要使用的任务队列实现。 |
queueLimit | 可以排队的最大待处理任务数。 |
threadFactory | ThreadFactory 是一个用于创建新的线程的线程池 |
poolName | 该线程池的名称。 |
priority | 分配给每个线程的优先级。这将覆盖由指定ThreadFactory分配的任何优先级。 |
corePoolSize | 初始化线程池时需要一起创建的线程的初始数量。 |
maxPoolSize | 该线程池可以维护的最大线程数 |
keepAliveTime | 线程可以保持空闲并等待新任务执行后释放的最长时间。可以使用自定义时间单位。 |
transactionTimeout | 在发送中断信号之前,可能允许线程运行单个任务的最长时间。可以使用自定义时间单位。 |
线程池配置相当简单。但是,应该注意,Grizzly在内部具有多个线程池实现:SyncThreadPool,FixedThreadPool和QueueLimitedThreadPool。选择哪种实现取决于配置。以下各节描述了每个线程池实现
FixedThreadPool
当queueLimit属性小于零且最大和核心池大小相同时,将选择此池。在执行任务时,FixedThreadPool没有同步,因此它提供了更好的性能。
QueueLimitedThreadPool
当queueLimit属性大于零且最大和核心池大小相同时,将选择此池。QueueLimitedThreadPool是FixedThreadPool的扩展,因此,如果不提供无限制的任务队列,它就能提供与FixedThreadPool相同的优点。
SyncThreadPool
当其他线程池的标准都不适用时,将选择此池。该线程池确实具有同步功能,可以对线程创建的决策进行精确控制。
例子
以下是一些使用TCPNIOTransportBuilder配置传输和/或线程池的示例。
final TCPNIOTransportBuilder builder = TCPNIOTransportBuilder.newInstance();
final TCPNIOTransport transport = builder.build();
使用所有默认配置值创建一个新的TCPNIOTransport。
final TCPNIOTransportBuilder builder = TCPNIOTransportBuilder.newInstance();
final TCPNIOTransport transport = builder.setIOStrategy(SameThreadIOStrategy.getInstance()).setTcpNoDelay(true).build();
使用SameThreadIOStrategy创建一个新的TCPNIOTransport实例,并将tcp-no-delay设置为true。请注意,配置调用可以链接。
final TCPNIOTransportBuilder builder = TCPNIOTransportBuilder.newInstance();
final ThreadPoolConfig config = builder.getWorkerThreadPoolConfig();
config.setCorePoolSize(5).setMaxPoolSize(5).setQueueLimit(-1);
final TCPNIOTransport transport = builder.build();
由于没有队列限制并且核心池和最大池大小相同,因此本示例将配置TCPNIOTransport以使用FixedThreadPool实现。