public class ThreadPoolExecutorFactoryBean extends ExecutorConfigurationSupport implements FactoryBean<java.util.concurrent.ExecutorService>, InitializingBean, DisposableBean
ThreadPoolExecutor を Bean スタイルで構成し ( "corePoolSize"、"maxPoolSize"、"keepAliveSeconds"、"queueCapacity" プロパティを介して)、ネイティブ ExecutorService 型の Bean 参照として公開できるようにします。 デフォルト設定はコアプールサイズ 1 で、最大プールサイズとキュー容量は無制限です。これは Executors.newSingleThreadExecutor() とほぼ同等であり、すべてのタスクで単一のスレッドを共有します。"queueCapacity" を 0 に設定すると、Executors.newCachedThreadPool() が模倣され、プール内のスレッドが潜在的に非常に高い数に即座にスケーリングされます。その時点で "maxPoolSize" を設定し、場合によってはより高い "corePoolSize" を設定することも検討してください(スケーリングの "allowCoreThreadTimeOut" モードも参照してください)。
別の方法として、コンストラクターインジェクションを使用して ThreadPoolExecutor インスタンスを直接セットアップするか、Executors クラスを指すファクトリメソッド定義を使用できます。 これは、特に構成クラスの一般的な @Bean メソッドに強く推奨されます。この FactoryBean バリアントは、実際の Executor 型ではなく FactoryBean 型を返すように強制します。
代わりにタイミングベースの ScheduledExecutorService が必要な場合は、ScheduledExecutorFactoryBean を検討してください。
ExecutorService、Executors、ThreadPoolExecutor, 連載形式 logger| コンストラクターと説明 |
|---|
ThreadPoolExecutorFactoryBean() |
| 修飾子と型 | メソッドと説明 |
|---|---|
protected java.util.concurrent.ThreadPoolExecutor | createExecutor(int corePoolSize, int maxPoolSize, int keepAliveSeconds, java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, java.util.concurrent.ThreadFactory threadFactory, java.util.concurrent.RejectedExecutionHandler rejectedExecutionHandler)ThreadPoolExecutor またはそのサブクラスの新しいインスタンスを作成します。 |
protected java.util.concurrent.BlockingQueue<java.lang.Runnable> | createQueue(int queueCapacity)BlockingQueue を作成して、ThreadPoolExecutor に使用します。 |
java.util.concurrent.ExecutorService | getObject() このファクトリによって管理されるオブジェクトのインスタンス(おそらく共有または独立)を返します。 |
java.lang.Class<? extends java.util.concurrent.ExecutorService> | getObjectType() この FactoryBean が作成するオブジェクトの型を返します。事前にわからない場合は null を返します。 |
protected java.util.concurrent.ExecutorService | initializeExecutor(java.util.concurrent.ThreadFactory threadFactory, java.util.concurrent.RejectedExecutionHandler rejectedExecutionHandler) ターゲット ExecutorService インスタンスを作成します。 |
boolean | isSingleton() このファクトリによって管理されるオブジェクトはシングルトンですか? つまり、 FactoryBean.getObject() は常に同じオブジェクト(キャッシュ可能な参照)を返しますか? |
void | setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) コアスレッドのタイムアウトを許可するかどうかを指定します。 |
void | setCorePoolSize(int corePoolSize)ThreadPoolExecutor のコアプールサイズを設定します。 |
void | setExposeUnconfigurableExecutor(boolean exposeUnconfigurableExecutor) この FactoryBean が、作成されたエグゼキューターの構成不可能なデコレーターを公開するかどうかを指定します。 |
void | setKeepAliveSeconds(int keepAliveSeconds)ThreadPoolExecutor のキープアライブ秒数を設定します。 |
void | setMaxPoolSize(int maxPoolSize)ThreadPoolExecutor の最大プールサイズを設定します。 |
void | setQueueCapacity(int queueCapacity)ThreadPoolExecutor の BlockingQueue の容量を設定します。 |
afterPropertiesSet, cancelRemainingTask, destroy, initialize, setAwaitTerminationSeconds, setBeanName, setRejectedExecutionHandler, setThreadFactory, setThreadNamePrefix, setWaitForTasksToCompleteOnShutdown, shutdownnewThreadcreateThread, getDefaultThreadNamePrefix, getThreadGroup, getThreadNamePrefix, getThreadPriority, isDaemon, nextThreadName, setDaemon, setThreadGroup, setThreadGroupName, setThreadPriorityclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitafterPropertiesSetdestroypublic void setCorePoolSize(int corePoolSize)
public void setMaxPoolSize(int maxPoolSize)
Integer.MAX_VALUE です。public void setKeepAliveSeconds(int keepAliveSeconds)
public void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut)
デフォルトは「false」。
ThreadPoolExecutor.allowCoreThreadTimeOut(boolean)public void setQueueCapacity(int queueCapacity)
Integer.MAX_VALUE です。正の値は、LinkedBlockingQueue インスタンスにつながります。その他の値は、SynchronousQueue インスタンスにつながります。
LinkedBlockingQueue, SynchronousQueuepublic void setExposeUnconfigurableExecutor(boolean exposeUnconfigurableExecutor)
デフォルトは "false" で、生のエグゼキューターを Bean 参照として公開します。このフラグを "true" に切り替えて、クライアントがエグゼキューターの構成を変更できないようにします。
Executors.unconfigurableExecutorService(java.util.concurrent.ExecutorService)protected java.util.concurrent.ExecutorService initializeExecutor(java.util.concurrent.ThreadFactory threadFactory,
java.util.concurrent.RejectedExecutionHandler rejectedExecutionHandler)ExecutorConfigurationSupportExecutorService インスタンスを作成します。afterPropertiesSet によって呼び出されます。ExecutorConfigurationSupport の initializeExecutor threadFactory - 使用する ThreadFactoryrejectedExecutionHandler - 使用する RejectedExecutionHandlerExecutorConfigurationSupport.afterPropertiesSet()protected java.util.concurrent.ThreadPoolExecutor createExecutor(int corePoolSize,
int maxPoolSize,
int keepAliveSeconds,
java.util.concurrent.BlockingQueue<java.lang.Runnable> queue,
java.util.concurrent.ThreadFactory threadFactory,
java.util.concurrent.RejectedExecutionHandler rejectedExecutionHandler)ThreadPoolExecutor またはそのサブクラスの新しいインスタンスを作成します。 デフォルトの実装では、標準の ThreadPoolExecutor が作成されます。カスタム ThreadPoolExecutor サブクラスを提供するためにオーバーライドできます。
corePoolSize - 指定されたコアプールサイズ maxPoolSize - 指定された最大プールサイズ keepAliveSeconds - 指定されたキープアライブ時間(秒)queue - 使用する BlockingQueuethreadFactory - 使用する ThreadFactoryrejectedExecutionHandler - 使用する RejectedExecutionHandlerExecutorConfigurationSupport.afterPropertiesSet()protected java.util.concurrent.BlockingQueue<java.lang.Runnable> createQueue(int queueCapacity)
正の容量値に対して LinkedBlockingQueue インスタンスが作成されます。SynchronousQueue その他。
queueCapacity - 指定されたキュー容量 LinkedBlockingQueue, SynchronousQueue@Nullable public java.util.concurrent.ExecutorService getObject()
FactoryBeanBeanFactory と同様に、これにより、シングルトンとプロトタイプの両方のデザインパターンをサポートできます。
この FactoryBean が呼び出し時にまだ完全に初期化されていない場合(たとえば、循環参照に関係しているため)、対応する FactoryBeanNotInitializedException をスローします。
Spring 2.0 以降、FactoryBeans は null オブジェクトを返すことができます。ファクトリはこれを通常の値として使用します。この場合、FactoryBeanNotInitializedException はスローされません。FactoryBean の実装では、必要に応じて FactoryBeanNotInitializedException 自体をすぐにスローすることをお勧めします。
FactoryBean<java.util.concurrent.ExecutorService> 内の getObject null にすることができます)FactoryBeanNotInitializedExceptionpublic java.lang.Class<? extends java.util.concurrent.ExecutorService> getObjectType()
FactoryBeannull を返します。これにより、たとえばオートワイヤーなどで、オブジェクトをインスタンス化せずに特定の型の Bean を確認できます。
シングルトンオブジェクトを作成している実装の場合、このメソッドはシングルトンの作成を可能な限り回避しようとします。むしろ、事前に型を推定する必要があります。プロトタイプの場合、ここで意味のある型を返すこともお勧めします。
このメソッドは、この FactoryBean が完全に初期化される前に呼び出すことができます。初期化中に作成された状態に依存しないでください。もちろん、利用可能な場合はそのような状態を引き続き使用できます。
注意 : オートワイヤーは、ここで null を返す FactoryBeans を単に無視します。FactoryBean の現在の状態を使用して、このメソッドを適切に実装することを強くお勧めします。
FactoryBean<java.util.concurrent.ExecutorService> 内の getObjectType null ListableBeanFactory.getBeansOfType(java.lang.Class<T>)public boolean isSingleton()
FactoryBeanFactoryBean.getObject() は常に同じオブジェクト(キャッシュ可能な参照)を返しますか? 注意 : FactoryBean がシングルトンオブジェクトを保持することを示す場合、getObject() から返されたオブジェクトは所有 BeanFactory によってキャッシュされる可能性があります。FactoryBean が常に同じ参照を公開しない限り、true を返さないでください。
FactoryBean 自体のシングルトンステータスは、通常、所有する BeanFactory によって提供されます。通常、そこではシングルトンとして定義する必要があります。
注意 : false を返すこのメソッドは、返されるオブジェクトが独立したインスタンスであることを必ずしも示しません。拡張 SmartFactoryBean インターフェースの実装は、SmartFactoryBean.isPrototype() メソッドを通じて独立したインスタンスを明示的に示す場合があります。この拡張インターフェースを実装しないプレーンな FactoryBean 実装は、isSingleton() 実装が false を返す場合、常に独立したインスタンスを返すと単純に想定されます。
FactoryBean は通常シングルトンインスタンスを管理するため、デフォルトの実装では true が返されます。
FactoryBean<java.util.concurrent.ExecutorService> 内の isSingleton FactoryBean.getObject(), SmartFactoryBean.isPrototype()