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

时间:2013-09-18 21:45:38

标签: java spring jmx managed-bean visualvm

我有一个可以通过jconsole / Visual VM访问的服务。

@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
}

但看起来网络应用控制器收到的foo的值并不总是与我在jconsle或visual VM中点击getFoo()时得到的值相匹配。 此外,调试器向我显示我的控制器得到的值不是我在jconsole中看到的值。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

  

但看起来web应用控制器收到的foo值并不总是与我在jconsle或visual VM中单击getFoo()时得到的值相匹配。此外,调试器向我显示我的控制器得到的值不是我在jconsole中看到的值。

我不确定,但我怀疑值foo在各个线程之间没有正确的内存同步。如果foo由显示该值的线程更新,则应使volatileprivate volatile String foo; - 或者使JMX过期。

MyService

当然,JMX请求是由您的Web应用程序处理的不同线程制作的。但是,我会想,调试器不会有问题。

修改

经过一番来回,我问是否有可能创建/使用了System.out.println("getting foo in " + System.identityHashCode(this) + " = " + foo);类的2个实例。 @abcXYZ向getter和setter方法添加类似{{1}}的内容,这些方法显示 实际上有两个不同的类实例。 因此,当Web应用程序使用另一个时,JMX线程正在查看其中一个。哎哟。