執行緒管理和 Spring 架構
請使用下列各節中的資訊,以避免未受管理的執行緒可能發生問題。
未受管理的執行緒
基於下列原因,請勿使用可以建立未受管理的執行緒的實務範例:
- 應用程式伺服器無法辨識未受管理的執行緒。
- 未受管理的執行緒無法存取 Java™ EE 環境定義資訊。
- 未受管理的執行緒可以使用資源,而不受應用程式伺服器監視。
- 未受管理的執行緒可能會對應用程式伺服器功能產生負面影響,例如循序關閉或從失敗中回復資源。
- 管理者無法控制未受管理的執行緒數目或其資源使用。
下列實務範例是要避免的 Spring Framework 實務範例:
- registerShutdownHook
避免使用 Spring Framework AbstractApplicationContext 類別及其子類別。 這些類別包括 public 方法 registerShutdownHook ,它會建立執行緒,並向 Java 虛擬機器 (JVM) 登錄它,以便在關閉時執行,以關閉應用程式環境定義。 作為替代方案,應用程式可以使用從應用程式伺服器儲存器收到的生命週期通知,在應用程式環境定義上明確呼叫 close 方法。
- WeakReferenceMonitor
Spring Framework 提供便利類別,以簡化 EJB 元件的開發。 不過,這些便利類別會大量產生 WeakReferenceMonitor 物件用於清理的未受管理執行緒。
執行緒儲存區作業
WebSphere® Application Server 支援使用 Spring Framework WorkManagerTaskExecutor 類別來非同步執行工作。
WorkManagerTaskExecutor 類別會使用應用程式伺服器所管理的執行緒儲存區,並委派給已配置的 WorkManager 實例。 如需配置工作管理員的相關資訊,請參閱相關主題。
請勿使用 Spring 架構隨附的其他 TaskExecutor 類別,因為它們可能會啟動未受管理的執行緒。
您可以使用已配置工作管理員的「Java 命名和目錄介面 (JNDI)」名稱作為 workManagerName 內容,在 Spring 配置檔中定義 WorkManagerTaskExecutor 實例。 下列範例使用應用程式伺服器中 DefaultWorkManager 的 JNDI 名稱,即
wm/default
:<bean id="myTaskExecutor"
class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
</bean>
排程
您可以使用 Spring Framework 中的 CommonJ WorkManager 排程套件,來使用應用程式伺服器所管理的執行緒。 請避免使用其他套件,例如 Quartz 排程器或 Java SE Development Kit (JDK) 中的 Timer ,因為它們可以啟動未受管理的執行緒。