簡體   English   中英

並發訪問導致ClassCastException(X無法強制轉換為X),或者JBoss中如何解決此類加載問題

[英]Concurrent access causes ClassCastException (X cannot be cast to X), or how to resolve such class loading problems in JBoss

我有一個關於 JBoss 和類加載的問題。

這是我正在使用的配置。 我在同一台服務器上有兩個JBoss 4.2.3.GA實例。 在每個實例上,一個應用程序正在運行,這些應用程序正在相互通信。 有一個實用程序類,打包在兩個應用程序檔案中。 此實用程序類在兩個應用程序中完全相同。

這通常工作正常,但在特定情況下,我得到ClassCastException 案例如下:

用戶正在使用 Web 應用程序,該應用程序在第一個 JBoss 實例上調用該應用程序(我們稱之為應用程序 A)。 應用程序 A 調用應用程序 B(在第二個實例上)。 此特定調用需要幾秒鍾才能成功。

如果另一個用戶試圖在類似的上下文中使用 Web 應用程序(調用應用程序 A,調用應用程序 B),並且如果此調用發生在第一次用戶調用期間,我會系統地收到 ClassCastException : X cannot be cast to X (其中 X 是我的實用程序類,由兩個應用程序共享)。

找了些資料,推斷是類加載問題。 事實上,在這個並發調用的特定上下文中,我的實用程序類不是由同一個類加載器加載的。 我放了一個打印命令來查看使用了哪個類加載器。 在通常的行為中, org.jboss.mx.loading.UnifiedClassLoader3用於加載類。 在上述特定情況下,應用程序 B 似乎為第二個用戶使用了不同的類加載器。 我的打印命令給了我以下內容:

WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/----------> Parent Classloader:java.net.FactoryURLClassLoader@de8209

我的猜測是應用程序 B 返回一個由這個WebappClassLoader加載的實用程序類的實例,而應用程序 A(使用 UnifiedClassLoader3)無法轉換它。

但我不明白為什么在這種情況下不能在應用程序 B 上使用 UnifiedClassLoader3。為什么使用這個 WebappClassLoader?

我所知道的 JBoss 實例中的類加載配置是使用了類加載隔離,以下配置用於兩個應用程序:

<jboss-app>
  <module-order>strict</module-order>  
  <loader-repository>applicationAorApplicationB.ear</loader-repository>
</jboss-app>

你有什么建議來解決這個問題嗎? 如何配置 jboss 類加載器以避免這些類轉換異常?

我確切地說沒有熱部署:每次部署應用程序時我都會清理服務器。

如果 JBoss 為不同的包使用不同的類加載器,它實際上是根據規范遵循行為。 對於許多版本,它沒有這樣做。 您可以禁用 WAR 類加載器隔離。 有關更多信息,請參閱JBoss 文檔

您還可以使用各種不同的方法,這些方法不需要應用程序在同一個類加載器中進行通信,這將使您的應用程序更加符合規范。 有關更多詳細信息,請參閱此 stackoverflow 問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM