【问题标题】:java.lang.ClassNotFoundException: No ClassLoaders found for: > org.jboss.jms.client.JBossConnectionFactoryjava.lang.ClassNotFoundException:没有找到类加载器:> org.jboss.jms.client.JBossConnectionFactory
【发布时间】:2019-08-30 10:17:04
【问题描述】:

我正在尝试在两台服务器之间配置 jms 设置。发送方在(服务器 A)jboss 5 上,接收方在(服务器 B)jboss 4 上(使用来自服务器 A 的远程队列。

当我尝试在 jboss 5 或 jboss 4 上同时运行时,它可以工作。但是当接收方在 jboss 4 上而发送方在 jboss 5 上时,就会抛出异常。

原因:java.lang.ClassNotFoundException:未找到适用于 org.jboss.jms.client.JBossConnectionFactory 的 ClassLoaders(无安全管理器:RMI 类加载器已禁用)

异常跟踪:

javax.naming.CommunicationException [Root exception is java.lang.ClassNotFoundException: No ClassLoaders found for: org.jboss.jms.client.JBossConnectionFactory (no security manager: RMI class loader disabled)]
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:728)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at org.jboss.ejb.plugins.jms.DLQHandler.createService(DLQHandler.java:182)
    at org.jboss.system.ServiceMBeanSupport.jbossInternalCreate(ServiceMBeanSupport.java:260)
    at org.jboss.system.ServiceMBeanSupport.create(ServiceMBeanSupport.java:188)
    at org.jboss.ejb.plugins.jms.JMSContainerInvoker.innerStartDelivery(JMSContainerInvoker.java:510)
    at org.jboss.ejb.plugins.jms.JMSContainerInvoker$ExceptionListenerImpl$ExceptionListenerRunnable.run(JMSContainerInvoker.java:1419)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: No ClassLoaders found for: org.jboss.jms.client.JBossConnectionFactory (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
    at org.jboss.system.JBossRMIClassLoader.loadClass(JBossRMIClassLoader.java:91)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at java.rmi.MarshalledObject.get(MarshalledObject.java:142)
    at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
    at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
    ... 8 more

我发现下面的链接似乎与我面临的问题相似,但无法准确地从哪个服务器到哪个服务器我需要在 war 文件下拥有客户端库? https://access.redhat.com/solutions/45133

更多详情:-

在我的例子中,jboss 4.0.4 和 jboss 5.1.0 都为不同的队列托管消息。 -- jboss 5 正在托管消息,并且侦听器在 jboss4 上为 QueueA。 -- jboss 4 正在托管消息,并且侦听器在 jboss 5 上为 QueueB。

我们想要实现的目标:- 服务器 A 上的 Jboss 4 应该与服务器 B 上的 jboss 5 上配置的 RemoteQueues 通信,这不工作并抛出异常。两台服务器之间没有进行通信。

【问题讨论】:

  • 那么 JBoss 向后兼容吗?如果不是,我猜无法保证从 JBoss5 发布的消息将适用于 JBoss4。
  • 您的问题确实不清楚消息被发送到哪里(例如,发送到 JBoss 5 服务器或 JBoss 4 服务器),您也不清楚抛出异常的位置。这些都是重要的细节。
  • 对于它的价值,您链接的 Red Hat 文章是关于与 JMS 完全不同的 RMI。它在这里真的没有用处。

标签: rmi jboss5.x jboss-4.0.x jboss-messaging jbossmq


【解决方案1】:

这里的底线是 JBoss 4.x 使用 JBossMQ 作为 JMS 实现,而 JBoss 5.x 使用 JBoss Messaging 作为 JMS 实现。两者不直接兼容,因此您需要决定哪个服务器将托管消息。

如果您希望 JBoss 5 服务器托管消息,那么所有客户端(包括在 JBoss 4 上运行的客户端)都需要使用 JBoss Messaging 客户端库。

如果您希望 JBoss 4 服务器托管消息,那么所有客户端(包括在 JBoss 5 上运行的客户端)都需要使用 JBossMQ 客户端库。

如果您同时在 JBoss 4 和 JBoss 5 服务器上托管消息,那么每个客户端都需要使用相应的客户端库来与他们合作的任何代理。

【讨论】:

  • 在我的例子中,jboss 4 和 jboss 5 都在为不同的队列托管消息。 -- jboss 5 正在托管消息,并且侦听器位于 jboss4 上,用于 queueA。 -- jboss 4 正在托管消息,并且侦听器位于 jboss 5 上,用于 queueB。
  • 我已经在 jboss 4(包括 4 个)上尝试过 jboss 5 客户端(包括 4 个)和在 jboss5(包括 5 个)上尝试过 jboss 4 个客户端,但我仍然遇到问题中提到的相同异常。
  • jboss 5 正在使用所有配置文件,而 jboss 4 正在使用默认配置文件。
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多