1

我正在部署一个使用 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”(或通过删除属性,最终效果相同)一切正常,即我可以查看和管理MBean来自 JConsole。

我不知道这是否是 Hibernate 代码或 JBoss 代码中的错误(如果有),但无论如何我不知道在哪里可以解决这个问题。任何人都可以帮助我让这两件事都正常工作(通过在 JBoss EAP 安装中分发的 JConsole 进行休眠查询缓存和 MBean 管理)?

为了帮助隔离和重现问题,我构建了一个简单的 EAR,它使用重现此问题所需的最少资源并附加到 JBoss 论坛中打开的讨论中,但到目前为止我还没有任何运气。如果有人对此感到好奇,网址是https://community.jboss.org/thread/233421

4

2 回答 2

0

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

部署 EAR 时,EAP 会抛出 NumberFormatException on Module "deployment.HibernateMBeanBug.ear.HibernateMBeanBug-persistence.jar:main" from Service Module Loader,期望“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  

org.hibernate.cache.spi.UpdateTimestampsCache 位于jboss-eap-6.1\modules\system\layers\base\org\hibernate\main\hibernate-core-4.2.0.CR1.jar,因此只需更新即可解决此问题。

至少这个问题是完全可重现的,所以我会向issues.jboss.org打开一个问题。

更新:测试将 jar 更新到 4.2.6.Final,没有解决问题。

更新2:

如果您添加到您的 persistence.xml 二级缓存:

<property name="hibernate.cache.use_second_level_cache" value="true" />

问题消失了。显然,如果您启用了 query_cache,MBean 迭代逻辑也希望找到实体缓存(二级缓存),如果未定义,则会抛出 NPE。对于值“false”,问题仍然存在,因此必须启用它。

以上只是猜测,我可能会走得更远。但是,出于某种原因,添加二级缓存似乎可以解决问题。

于 2013-10-18T16:21:18.813 回答
0

https://access.redhat.com/solutions/180173

您需要将系统属性 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 等)中定义,例如:

<system-properties>
    <property name="org.apache.tomcat.util.ENABLE_MODELER" value="true"/>
</system-properties>

如果要通过管理 CLI 添加系统属性:

/system-property=org.apache.tomcat.util.ENABLE_MODELER:add(value=true)

请注意,在 EAP 6.0.0 上设置系统属性 ENABLE_MODELER 已损坏,如 JBoss 中所述,在 ENABLE_MODELER 设置为 true 时无法启动。该问题的修复包含在 EAP 6.0.1 及更高版本中,并且此一次性补丁可在 EAP 6.0.0 的客户门户上获得。

于 2017-04-14T07:18:59.213 回答