【问题标题】:NPE in JBossWS on JBoss 4.2.2 with jmxremote enabled启用了 jmxremote 的 JBoss 4.2.2 上的 JBossWS 中的 NPE
【发布时间】:2010-09-12 21:15:12
【问题描述】:

我正在尝试设置 JBoss 4.2.2 和 JConsole 以进行远程监控。根据我在网上找到的许多操作方法,您需要通过在 run.conf 中设置以下选项来启用 jmxremote。 (我意识到其他两个选项禁用身份验证)

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=11099"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false" 

这会导致以下异常:

13:06:56,418 INFO [TomcatDeployer] performDeployInternal :: deploy, ctxPath=/services, warUrl=.../tmp/deploy/tmp34585xxxxxxxxx.ear-contents/mDate-Services-exp.war/
13:06:57,706 WARN [AbstractServerConfig] getWebServicePort :: Unable to calculate 'WebServicePort', using default '8080'
13:06:57,711 WARN [AbstractServerConfig] getWebServicePort :: Unable to calculate 'WebServicePort', using default '8080'
13:06:58,070 WARN [AbstractServerConfig] getWebServicePort :: Unable to calculate 'WebServicePort', using default '8080'
13:06:58,071 WARN [AbstractServerConfig] getWebServicePort :: Unable to calculate 'WebServicePort', using default '8080'
13:06:58,138 ERROR [MainDeployer] start :: Could not start deployment: file:/opt/jboss-4.2.2.GA/server/default/tmp/deploy/tmp34585xxxxxxxxx.ear-contents/xxxxx-Services.war
java.lang.NullPointerException
at org.jboss.wsf.stack.jbws.WSDLFilePublisher.getPublishLocation(WSDLFilePublisher.java:303)
at org.jboss.wsf.stack.jbws.WSDLFilePublisher.publishWsdlFiles(WSDLFilePublisher.java:103)
at org.jboss.wsf.stack.jbws.PublishContractDeploymentAspect.create(PublishContractDeploymentAspect.java:52)
at org.jboss.wsf.framework.deployment.DeploymentAspectManagerImpl.deploy(DeploymentAspectManagerImpl.java:115)
at org.jboss.wsf.container.jboss42.ArchiveDeployerHook.deploy(ArchiveDeployerHook.java:97) 
...

我的应用程序使用 JWS,根据这个错误:

https://jira.jboss.org/jira/browse/JBWS-1943

建议这种解决方法:

JAVA_OPTS="$JAVA_OPTS -Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl"
JAVA_OPTS="$JAVA_OPTS -Djboss.platform.mbeanserver"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"

(https://developer.jboss.org/wiki/JBossWS-FAQ#jive_content_id_How_to_use_JDK_JMX_JConsole_with_JBossWS)

我已经尝试过了,但是在尝试在我的耳朵中部署一个 sar 文件时抛出了以下异常,该文件只包含一个类,该类为我的应用程序需要的几个计划作业实现 Schedulable:

Caused by: java.lang.NullPointerException
at EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap.hash(ConcurrentReaderHashMap.java:298)
at EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap.get(ConcurrentReaderHashMap.java:410)
at org.jboss.mx.server.registry.BasicMBeanRegistry.getMBeanMap(BasicMBeanRegistry.java:959)
at org.jboss.mx.server.registry.BasicMBeanRegistry.contains(BasicMBeanRegistry.java:577)

关于从这里去哪里有什么建议吗?

编辑:

我也尝试了以下变体:

JAVA_OPTS="$JAVA_OPTS -DmbipropertyFile=../server/default/conf/mbi.properties  -DpropertyFile=../server/default/conf/mdate.properties -Dwicket.configuration=DEVELOPMENT"
JAVA_OPTS="$JAVA_OPTS -Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl"
JAVA_OPTS="$JAVA_OPTS -Djboss.platform.mbeanserver"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"

我使用的是 JDK 1.6.0_01-b06

【问题讨论】:

  • 这个问题在 JBoss 4.2.3 中得到修复

标签: java jboss jmx jconsole jbossws


【解决方案1】:

老实说,我从未尝试过这种远程处理方法。但是,如果您的客户端计算机和服务器恰好都是 linux 机器或类似的带有 SSH 的 *nixes,那么您可以ssh -XCA 到服务器并在服务器上启动 JConsole 并显示 GUI在您的客户端机器上使用 X 端口转发。在本地运行到您要监控的服务器 JVM 的 JConsole应该在连接上没有任何问题。

我个人认为这是一个绝妙的技巧,但我意识到它并没有真正解决让 JConsole 通过 JWS 远程连接的问题。

【讨论】:

  • 我已经尝试过了,它可以工作。然而,JConsole 非常耗费资源,它必须运行一段时间才能有用。此外,X 转发对于图表/更新来说非常缓慢,以至于它几乎无法使用。
【解决方案2】:

我要做的第一件事是删除 JBoss /default 下的 /tmp 和 /work 目录并重新部署 WAR。如果没有,我会升级 JDK 以使用更新的 1.6 版本。 1.6.0_01 已经很老了。

【讨论】:

    【解决方案3】:

    我不确定您尝试使用 WS 访问 mbean 服务器是否有特定原因,但使用 JConsole 您可以直接访问远程 JVM。为此,请使用“service:jmx:rmi:///jndi/rmi://:/jmxrmi”(其中 是您尝试连接的任何机器, 是 11099) 作为远程进程。

    我已经使用它连接到任何 1.6 版 JVM,该 JVM 公开了一个 mbean 服务器(JBoss、ActiveMQ 等)。

    【讨论】:

    • 你误读了这个问题。我没有使用 WS 来访问 mbean 服务器。我在应用程序中使用 WS。
    【解决方案4】:

    我不知道这是否相关,但 JBoss 倾向于重定向到自身。如果你连接到一个主机,比如 jboss.localdomain:3873,想要连接到一个 ejb,JBoss 可能会查找它自己的主机名并重定向到它从那里获得的地址。如果你有一个公共主机名,它可能会找到它(比如 jboss.publicdomain.com),并告诉客户端重新连接到 jboss.publicdomain.com:1099。根据您的 DNS,这可能是也可能不是您的客户端可访问的地址。

    此问题有多种变体,此外,有时初始“连接检查”有效,因此客户端应用程序部署,但稍后连接失败。

    【讨论】:

      【解决方案5】:

      遇到了类似的问题,但使用 JBoss Seam:查看 JBSEAM-4029。作为解决方法之一,它建议覆盖运行到 NPE 中的类 - 在 Seam 的情况下为 JBossClusterMonitor

      我敢打赌,JWS 代码会遇到完全相同的问题,即最终会在某个时间点调用 MBeanServerFactory.findMBeanServer(null)。堆栈跟踪应显示执行此操作的确切类。

      【讨论】:

        猜你喜欢
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        相关资源
        最近更新 更多