執行緒管理和 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 ,因為它們可以啟動未受管理的執行緒。