gpt4 book ai didi

java - 并发访问导致ClassCastException(X无法强制转换为X),或者在JBoss中如何解决此类类加载问题

转载 作者:行者123 更新时间:2023-12-01 17:56:28 24 4
gpt4 key购买 nike

我有一个关于 JBoss 和类加载的问题。

这是我正在使用的配置。我在同一台服务器上有两个 JBoss 4.2.3.GA 实例。每个实例上都运行一个应用程序,并且这些应用程序相互通信。有一个实用程序类,包含在两个应用程序文件中。该实用程序类在两个应用程序中完全相同。

这通常工作正常,但在特定情况下,我会得到ClassCastException。案例如下:

用户正在使用 Web 应用程序,该应用程序调用第一个 JBoss 实例上的应用程序(我们将其称为应用程序 A)。应用程序 A 调用应用程序 B(在第二个实例上)。此特定调用需要几秒钟才能成功。

如果另一个用户尝试在类似的上下文中使用 Web 应用程序(调用应用程序 A,应用程序 A 调用应用程序 B),并且如果此调用发生在第一个用户调用期间,我会系统地收到 ClassCastException : X无法转换为 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 documentation了解更多信息。

您还可以使用各种不同的方法,这些方法不需要应用程序位于同一类加载器中进行通信,这将使您的应用程序更符合规范。请参阅this stackoverflow question了解更多详情。

关于java - 并发访问导致ClassCastException(X无法强制转换为X),或者在JBoss中如何解决此类类加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com