Java MBean中的属性与web应用程序接收的属性不同
我有一个可以通过jconsole/visualvm访问的服务Java MBean中的属性与web应用程序接收的属性不同,java,spring,jmx,managed-bean,visualvm,Java,Spring,Jmx,Managed Bean,Visualvm,我有一个可以通过jconsole/visualvm访问的服务 @ManagedResource public class MyService { private String foo; @ManagedAttribute public void setFoo(String newVal) { this.foo = newVal; } @ManagedAttribute public String getFoo() { return this.foo; } //som
@ManagedResource
public class MyService
{
private String foo;
@ManagedAttribute
public void setFoo(String newVal) { this.foo = newVal; }
@ManagedAttribute
public String getFoo() { return this.foo; }
//some other things here that access foo
}
但是看起来web应用程序控制器接收的foo
的值并不总是与我在jconsle或visual VM中单击getFoo()时得到的值匹配。
此外,调试器向我显示,我的控制器获得的值不是我在jconsole中看到的值
有什么想法吗
但是看起来web应用程序控制器接收到的foo值并不总是与我在jconsle或visual VM中单击getFoo()时得到的值相匹配。此外,调试器向我显示,我的控制器获得的值不是我在jconsole中看到的值
我不确定,但我怀疑不同线程之间的foo
值没有正确地进行内存同步。如果与显示值的线程不同的线程更新了foo
,或者JMX已经过时,那么应该将foo
设置为volatile
private volatile String foo;
当然,JMX请求是从一个不同的线程发出的,您的web应用程序将由该线程处理。然而,我本以为调试器不会出现问题
编辑:
经过一番反复,我问是否有可能创建/使用了MyService
类的两个实例@abcXYZ添加类似于System.out.println的内容(“将foo放入”+System.identityHashCode(this)+“=”+foo)代码>到getter和setter方法,这表明出于某种原因,实际上有2个不同的类实例。
因此,当web应用程序使用另一个时,JMX线程正在查看其中一个。哎哟。完全忘记了!!我试试看。谢谢我所说的调试器是指web应用程序的调试器。不适用于jmx。如果web应用程序调试器的值与jmx匹配,而我的web应用程序显示的值与jmx不匹配,我会更加害怕。太糟糕了。这对我不起作用(我将foo
设置为volatile
,但jmx中的值仍然与我的web中的值不同。有可能有两个MyService实例在@abcXYZ发布?一些printf(或记录器)怎么样在这里调试并确保打印您正在执行的MyService实例。类似于System.out.println(“将foo放入”+System.identityHashCode(this)+“=”+foo);
是的,我怀疑是这样的@abcXYZ.Btw,那不是“内存地址”也不必是唯一的。只是为了记录。实例哈希代码通常是唯一的。:-)