【问题标题】:Attribute in MBean is different from the one received by web appMBean 中的属性与 Web 应用程序接收到的属性不同
【发布时间】:2013-09-18 21:45:38
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: java spring jmx managed-bean visualvm


    【解决方案1】:

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

    我不确定,但我怀疑值 foo 没有在各个线程之间正确地进行内存同步。如果 foo 是由与显示值的线程不同的线程更新的,则应将 foo 设为 volatile - 或者忍受 JMX 已过时。

    private volatile String foo;
    

    当然,JMX 请求是由您的 Web 应用程序将由其处理的不同线程发出的。然而,我原以为调试器不会有问题。

    编辑:

    经过一番反复,我问是否有可能创建/使用了 MyService 类的 2 个实例。 @abcXYZ 在 getter 和 setter 方法中添加了类似 System.out.println("getting foo in " + System.identityHashCode(this) + " = " + foo); 的内容,这表明出于某种原因实际上有 2 个不同的类实例。 因此,JMX 线程正在查看其中一个,而 Web 应用程序正在使用另一个。哎哟。

    【讨论】:

    • 完全忘记了!!我会试试的。谢谢!!
    • 调试器是指 Web 应用程序的调试器。不适用于 jmx。如果 web 应用程序的调试器中的值与 jmx 匹配,而我的 web 应用程序显示其他情况,我会更加害怕。
    • 太糟糕了。它对我不起作用。 :( 我使foo volatile 仍然,jmx 中的值与我的网络应用程序中的值仍然不同
    • 这个 MyService 的 2 个实例是否有可能被发布 @abcXYZ?在这里进行一些 printf(或记录器)调试怎么样,并确保打印您正在执行的 which MyService 实例。类似System.out.println("getting foo in " + System.identityHashCode(this) + " = " + foo);
    • 是的,我怀疑类似@abcXYZ。顺便说一句,这不是“内存地址”,也不必是唯一的。只是为了记录。它的实例 hashCode 通常是唯一的。 :-)
    猜你喜欢
    • 2015-06-19
    • 2010-10-04
    • 2014-11-30
    • 2012-05-14
    • 2021-02-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多