Hibernate JBoss EAP 6.1未在JConsole上显示JMX MBean

Hibernate JBoss EAP 6.1未在JConsole上显示JMX MBean,hibernate,jboss7.x,jmx,mbeans,Hibernate,Jboss7.x,Jmx,Mbeans,我正在部署一个使用Hibernate 4.2.0.Final的应用程序,并将查询缓存(通过在persistence.xml中将属性Hibernate.cache.use_query_cache设置为“true”)启用到JBoss EAP 6.1 Final 启动JBoss并部署应用程序后,当我打开JBoss-eap-6.1.0\bin\jconsole.bat,在本地连接到JBoss进程并导航到MBeans选项卡时,我只看到一个空白选项卡。我甚至看不到通常注册的基本MBean(如jboss.*或

我正在部署一个使用Hibernate 4.2.0.Final的应用程序,并将查询缓存(通过在persistence.xml中将属性Hibernate.cache.use_query_cache设置为“true”)启用到JBoss EAP 6.1 Final

启动JBoss并部署应用程序后,当我打开JBoss-eap-6.1.0\bin\jconsole.bat,在本地连接到JBoss进程并导航到MBeans选项卡时,我只看到一个空白选项卡。我甚至看不到通常注册的基本MBean(如jboss.*或java.lang.*MBean)

我注意到,只要将persistence.xml更改为将“hibernate.cache.use_query_cache”设置为“false”(或者删除属性,这最终会产生相同的效果),一切都可以正常工作,也就是说,我可以从JConsole查看和管理MBean

我不知道这是Hibernate代码还是JBoss代码中的一个bug(如果有),但无论如何,我都不知道在哪里可以修复这个bug。有人能帮我把这两件事都做好吗(Hibernate查询缓存和通过JBoss EAP安装中分发的JConsole进行MBeans管理)


为了帮助隔离和重现这个问题,我用重现这个问题所需的最少资源构建了一个简单的EAR,并附加到JBoss论坛上的一个讨论中,但到目前为止,我还没有任何运气。如果有人对此感到好奇,那么url是

不知道这是否有帮助,但是:

在退出EAR时,EAP在服务模块加载器的
模块“deployment.hibernatembanbug.EAR.hibernatembanbug persistence.jar:main”上抛出NumberFormatException,期望“main”部分是一个数字。在JConsole访问上,它在迭代MBean时抛出NullPointerException

在这一行:

doIterate(child, childAddress);
当检测MBean时。child=null和childAddress=

[
    ("deployment" => "HibernateMBeanBug.ear"),
    ("subdeployment" => "HibernateMBeanBug-persistence.jar"),
    ("subsystem" => "jpa"),
    ("hibernate-persistence-unit" => "HibernateMBeanBug.ear/HibernateMBeanBug-persistence.jar#AnyPU"),
    ("entity-cache" => "org.hibernate.cache.spi.UpdateTimestampsCache")
]
然后,在下一次迭代中,当它请求“child”的孩子时,它将命中一个NPE

这两个异常都可以通过调试器捕获。NPE的堆栈跟踪为

Daemon System Thread [RMI TCP Connection(24)-192.168.11.2] (Suspended (exception NullPointerException)) 
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 49   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.iterate() line: 39  
    ModelControllerMBeanHelper.queryNames(ObjectName, QueryExp) line: 144   
    ModelControllerMBeanServerPlugin.queryNames(ObjectName, QueryExp) line: 166 
    PluggableMBeanServerImpl.queryNames(ObjectName, QueryExp) line: 308 
    RMIConnectionImpl.doOperation(int, Object[]) line: 1506 
    RMIConnectionImpl.access$300(RMIConnectionImpl, int, Object[]) line: 97 
    RMIConnectionImpl$PrivilegedOperation.run() line: 1328  
    RMIConnectionImpl.doPrivilegedOperation(int, Object[], Subject) line: 1420  
    RMIConnectionImpl.queryNames(ObjectName, MarshalledObject, Subject) line: 590   
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 606  
    UnicastServerRef2(UnicastServerRef).dispatch(Remote, RemoteCall) line: 322  
    Transport$1.run() line: 177 
    Transport$1.run() line: 174 
    AccessController.doPrivileged(PrivilegedExceptionAction<T>, AccessControlContext) line: not available [native method]   
    TCPTransport(Transport).serviceCall(RemoteCall) line: 173   
    TCPTransport.handleMessages(Connection, boolean) line: 556  
    TCPTransport$ConnectionHandler.run0() line: 811 
    TCPTransport$ConnectionHandler.run() line: 670  
    ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1145  
    ThreadPoolExecutor$Worker.run() line: 615   
    Thread.run() line: 724  
问题消失了。显然,如果启用了query_缓存,MBean迭代逻辑也希望找到实体缓存(二级缓存),如果未定义,则会抛出NPE。对于值“false”,问题仍然存在,因此必须启用它

不过,以上只是猜测,我可能会大错特错。然而,出于某种原因,添加二级缓存似乎可以达到目的。

您需要将系统属性org.apache.tomcat.util.ENABLE_MODELER设置为true以监视这些MBean。此系统属性将导致JBoss公开MBean“JBoss.web:type=*”

您可以在EAP 6独立模式下将系统属性添加到$JBOSS_HOME/bin/standalone.conf,如下所示:

JAVA_OPTS="$JAVA_OPTS -Dorg.apache.tomcat.util.ENABLE_MODELER=true"
也可以在JBoss EAP 6配置文件(standalone(-*).xml或domain.xml等)中定义系统属性,如:

请注意,在EAP 6.0.0上设置系统属性ENABLE_MODELER是不正确的,正如JBoss中所讨论的那样,在ENABLE_MODELER设置为true时启动失败。EAP 6.0.1及以后版本中包含此问题的修复程序,此一次性补丁可在EAP 6.0.0的客户门户网站上获得

JAVA_OPTS="$JAVA_OPTS -Dorg.apache.tomcat.util.ENABLE_MODELER=true"
<system-properties>
    <property name="org.apache.tomcat.util.ENABLE_MODELER" value="true"/>
</system-properties>
/system-property=org.apache.tomcat.util.ENABLE_MODELER:add(value=true)