有什么方法可以通过JMX查看存储在ehcache中的数据/对象吗?我只找到了缓存统计信息,但我需要查看对象结构。
如果你需要这个东西,你可以构建它,但它在Ehcache JMX实现中不可用。 我不希望它,因为存储在 ehcache 中的对象是否可以通过 JMX 显示是未知的。 如果您知道它们是,您当然可以创建一个 MBean,给定对 ehcache CacheManager 或 Cache 的引用,可以公开缓存的内容。
请记住,除非您使用仅内存缓存,否则缓存中的对象不在内存中,而是在磁盘上,或者,如果您使用的是 terracotta,它们可能位于远程服务器上。 此外,有时以序列化形式存储 Java 对象会更有效。 如果这样做,查看数据将需要反序列化。
如果您只对在调试问题时查看这些对象感兴趣,我会考虑仅依赖调试器,例如良好 IDE 中提供的调试器。 NetBeans 和 Eclipse 都具有可用于查看缓存内容的调试器。 我经常这样做。
由于您用"spring"标记了这个问题,因此我假设您使用的是 spring。 在春季创建MBean非常简单。您只需将导出器 Bean 添加到上下文中,并使您的 MBean 实现一个与您的对象名称相同但末尾添加 MBean 的接口。 下面是一个示例:
应用程序上下文.xml:
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
p:autodetect="true"/>
<bean name="FOO:name=foo" class="com.foo.test.Foo"/>
福.java:
package com.foo.test;
public class Foo implements FooMBean {
private String name;
...
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void printName() {
System.out.println(name);
}
}
FooMBean.java:
package com.foo.test;
public interface FooMBean {
public String getName();
public void setName(String name);
public void printName();
}
在此示例中,"foo"对象将公开为 JMX MBean,该对象将具有名为"name"的属性和名为"printName"的操作。 MBean 的名称将是:"FOO:name=foo"。 您可以自定义所有这些行为。 请参阅:http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#jmx-exporting