Spring MBeanExporter: запись трассировки стека исключения - PullRequest
2 голосов
/ 03 сентября 2010

В Spring MVC трассировка стека исключений записывается в журнал, если он полностью возвращается к платформе (например, если есть исключение NullPointerException). Есть ли простой способ сделать это, используя MBeanExporter Spring?

Я знаю, что в этом методе могли бы быть попытки-ловцы, но это привело бы к беспорядку. Я проверил документацию Spring ( Глава 22 * ​​1004 * - это документация по JMX) и ничего не увидел. Я также ничего не видел на SO. Я также посмотрел исходный код для MBeanExporter, и, кажется, есть способ зарегистрировать слушателей для регистрации MBean, но не для обработки запросов MBean.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2013

В моем приложении, основанном на Spring 3.1, ни @ManagedAttributes, ни @ManagedOperations не отслеживаются и не регистрируются.

Итак, я рассмотрел расширение MBeanExporter, которое завершается ошибкой при сбое вызова метода MBean:

public class LoggingFailedCallsMBeanExporter extends MBeanExporter {

    protected ModelMBean createModelMBean() throws MBeanException {
        // super method does:
        // return (this.exposeManagedResourceClassLoader ? new SpringModelMBean() : new RequiredModelMBean());
        ModelMBean superModelMBean = super.createModelMBean();

        // but this.exposeManagedResourceClassLoader is not visible, so we switch on the type of the returned ModelMBean
        if (superModelMBean instanceof SpringModelMBean) {
              return new SpringModelMBean() {
                    @Override
                    public Object invoke(String opName, Object[] opArgs, String[] sig) throws MBeanException, ReflectionException {
                          try {
                                return super.invoke(opName, opArgs, sig);
                          } catch (MBeanException e) {
                                LOGGER.warn("Issue on a remote call", e);
                                throw e;
                          } catch (ReflectionException e) {
                                LOGGER.warn("Issue on a remote call", e);
                                throw e;
                          } catch (RuntimeException e) {
                                LOGGER.warn("Issue on a remote call", e);
                                throw e;
                          } catch (Error e) {
                                LOGGER.warn("Issue on a remote call", e);
                                throw e;
                          }
                    }
              };
        } else {
            return new RequiredModelMBean() {
                @Override
                public Object invoke(String opName, Object[] opArgs, String[] sig) throws MBeanException, ReflectionException {
                      try {
                            return super.invoke(opName, opArgs, sig);
                      } catch (MBeanException e) {
                            LOGGER.warn("Issue on a remote call", e);
                            throw e;
                      } catch (ReflectionException e) {
                            LOGGER.warn("Issue on a remote call", e);
                            throw e;
                      } catch (RuntimeException e) {
                            LOGGER.warn("Issue on a remote call", e);
                            throw e;
                      } catch (Error e) {
                            LOGGER.warn("Issue on a remote call", e);
                            throw e;
                      }
                }
          };
        }
}
0 голосов
/ 04 сентября 2010

MBeanExporter - очень гибкая вещь, и может справиться со многими различными ситуациями.Поскольку вы не показали нам пример кода, я предполагаю, что вы используете аннотации @ManagedOperation и @ManagedAttribute, поскольку они кажутся наиболее распространенными.

Если у вас есть метод получения, помеченный @ManagedAttribute, и этот метод получения выдает исключение, тогда он нигде не будет зарегистрирован, он будет просто передан клиенту для обработки.Иногда это раздражает, но, похоже, нет способа настроить его на другое. Однако методы

@ManagedOperation будут регистрировать и регистрировать свои исключения.Я не знаю, почему проводится это различие, но так оно и есть.

...