启用了jmxremote的JBoss 4.2.2上的JBossWS中的NPE
我正在尝试设置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
解决方案
老实说,我从未尝试过这种远程处理方法。但是,如果客户端计算机和服务器都恰巧是Linux机器或者带有SSH的类似* nixes,则可以对服务器使用ssh -XCA并在服务器上启动JConsole并通过X端口转发。在要监视的服务器JVM本地运行的JConsole连接应该没有任何问题。
我个人认为这是一个不错的技巧,但我意识到这并不能真正解决让JConsole通过JWS进行远程连接的问题。
我要做的第一件事是删除JBoss / default下的/ tmp和/ work目录,然后重新部署WAR。如果不是这样,我将升级JDK以使用最新版本的1.6. 1.6.0_01已经很老了。
我不确定我们是否有特定原因要尝试使用WS访问mbean服务器,但是使用JConsole可以直接访问远程JVM。为此,请使用" service:jmx:rmi:/// jndi / rmi:// <远程计算机>:<端口> / jmxrmi"(其中<remote-machine>是我们尝试连接到的任何计算机,并且<port >是11099)作为远程进程。
我使用它来连接到任何公开mbean服务器(JBoss,ActiveMQ等)的1.6 JVM。
我不知道这是否相关,但是JBoss倾向于重定向到自身。如果我们连接到主机,例如说jboss.localdomain:3873,想要连接到ejb,则JBoss可能会查找自己的主机名,然后重定向到它从那里获得的地址。如果我们有公共主机名,它可能会找到该主机名(例如jboss.publicdomain.com),并告诉客户端重新连接到jboss.publicdomain.com:1099. 根据DNS,这可能是客户端可能无法访问的地址。
此问题有多种形式,此外,有时可以进行初始的"连接检查",因此,客户端应用程序可以部署,但稍后在连接时会失败。
发生了类似的问题,但对于JBoss Seam:请看一下JBSEAM-4029. 作为解决方法之一,建议在Seam的情况下重写运行在NPE中的类" JBossClusterMonitor"。
我敢打赌,JWS代码会遇到完全相同的问题,即最终在某个时间点调用MBeanServerFactory.findMBeanServer(null)
。堆栈跟踪应显示执行此操作的确切类。