启用jmxremote的JBoss 4.2.2上的JBossWS中的NPE

wrerum 发布于 2018-05-07 java 最后更新 2018-05-07 18:34 250 浏览

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

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
已邀请:

lest

赞同来自:

我诚实地从未尝试过这种遥控方法。但是,如果您的客户机和服务器都是Linux机箱或类似的带有SSH的* nixes,那么您可以将ssh -XCA放置到服务器上,并在服务器上启动JConsole,并使用X端口转发在客户机上显示GUI。 JConsole本地运行到您要监控的服务器JVM应该没有任何连接问题。 我个人认为这是一个很好的技巧,但我意识到它并不能真正解决让JConsole通过JWS远程连接的问题。

oad

赞同来自:

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

punde

赞同来自:

我不确定是否有特定的原因试图使用WS访问mbean服务器,但使用JConsole可以直接访问远程JVM。为此,使用“service:jmx:rmi:/// jndi/rmi://< remote-machine>:< port>/jmxrmi”(其中< remote-machine>是您试图连接到的任何机器和< port>是11099)作为远程进程。 我用它来连接任何公开mbean服务器的JVM(JBoss,ActiveMQ等)。

xid

赞同来自:

我不知道这是否相关,但JBoss倾向于重定向到自己。如果你连接到一个主机,比如说jboss.localdomain:3873,想要连接到一个ejb,JBoss可能会查找自己的主机名并重定向到它从那里得到的地址。如果你有一个公共的主机名,它可能会找到(比如说jboss.publicdomain.com),并告诉客户端重新连接到jboss.publicdomain.com:1099。根据您的DNS,这可能会或可能不是您客户端的可达地址。 这个问题有各种各样的变化,作为奖励,有时候最初的“连接检查”起作用,所以客户端应用程序部署,但以后连接失败。

fomnis

赞同来自:

有类似的问题,但对于JBoss Seam:看看JBSEAM-4029。作为其中一种解决方法,它建议覆盖运行到NPE中的类 - 在Seam的案例中是JBossClusterMonitor。 我敢打赌,JWS代码会遇到完全相同的问题,即在某个时间结束时调用MBeanServerFactory.findMBeanServer(null)。堆栈跟踪应该显示哪个确切的类。