Grizzly core configuration

原文鏈接:https://javaee.github.io/grizzly/coreconfig.html#

核心配置

核心框架的主要配置點是傳輸實例(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實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章