Hibernate JBoss EAP 6.1未在JConsole上显示JMX MBean
我正在部署一个使用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管理)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.*或
为了帮助隔离和重现这个问题,我用重现这个问题所需的最少资源构建了一个简单的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)