![](/img/trans.png)
[英]ClassCastException cannot be cast to class X and Y are in unnamed module of loader 'app'
[英]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.