2013-09-18 3 views
0

У меня есть служба, к которой можно получить доступ через jconsole/Visual VM.Атрибут в MBean отличается от полученного веб-приложением

@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 принимаемого контроллером веб-приложения не всегда совпадает со значением, я получаю, когда я нажимаю getFoo() в любом jconsle или визуальной VM. Кроме того, отладчик показывает мне, что значение, которое получает мой контроллер, не то, что я вижу в jconsole.

Есть идеи?

ответ

2

Но похоже, что значение foo, полученное контроллером веб-приложения, не всегда соответствует значению, которое я получаю, когда я нажимаю getFoo() в jconsle или визуальной VM. Кроме того, отладчик показывает мне, что значение, которое получает мой контроллер, не то, что я вижу в jconsole.

Я не уверен, но я подозреваю, что значение foo не является должным образом памятью, синхронизированной между различными потоками. Вы должны сделать foo be volatile, если он обновляется другим потоком, чем тот, который отображает это значение - или мигает с устаревшим JMX.

private volatile String foo; 

Конечно, запрос JMX выполняется из другого потока, с которым будет обрабатываться ваше веб-приложение. Я бы подумал, однако, что отладчик не имел бы проблемы.

Edit:

После некоторого назад и вперед, я спросил, если это было возможно, что 2 экземпляры MyService класса становились созданы б/у. @abcXYZ добавляет что-то вроде System.out.println("getting foo in " + System.identityHashCode(this) + " = " + foo); к методам getter и setter, которые показали, что были фактически 2 разных экземпляра класса по какой-то причине. Итак, поток JMX смотрел на него, а веб-приложение использовало другое. Уч.

+0

Полностью забыл !! Я попробую. Благодаря!! – 0x56794E

+1

Отладчиком я имел в виду отладчик для веб-приложения. НЕ для jmx. Я был бы еще более взволнован, если значение от отладчика для веб-приложения соответствует jmx, и мое веб-приложение показывает иначе. – 0x56794E

+0

слишком плохо. это не работает для меня. :( Я делаю 'foo'' volatile', и все же значение в jmx по-прежнему отличается от значения в моем веб-приложении – 0x56794E

 Смежные вопросы

  • Нет связанных вопросов^_^