Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MBean中的属性与web应用程序接收的属性不同_Java_Spring_Jmx_Managed Bean_Visualvm - Fatal编程技术网

Java MBean中的属性与web应用程序接收的属性不同

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

我有一个可以通过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; }

  //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,那不是“内存地址”也不必是唯一的。只是为了记录。实例哈希代码通常是唯一的。:-)