2010-09-03 1 views
2

Dans Spring MVC, la trace de pile d'une exception est enregistrée si elle revient à l'infrastructure (par exemple, s'il existe une exception NullPointerException). Existe-t-il un moyen simple de le faire en utilisant MBeanExporter de Spring?Spring MBeanExporter: notation d'une piletrace d'exception

Je sais que je pourrais avoir des essayages dans la méthode pour ce faire, mais cela entraînerait un encombrement. J'ai vérifié la documentation de Spring (Chapter 22 est celle sur JMX) et n'ai rien vu. Je n'ai également rien vu sur SO. J'ai également regardé le code source pour MBeanExporter, et il semble y avoir un moyen d'enregistrer les écouteurs pour l'enregistrement MBean, mais pas pour la gestion des requêtes MBean.

Répondre

2

Dans mon application basée sur Spring 3.1, ni @ManagedAttributes ni @ManagedOperations ne sont interceptés ou consignés.

donc je suis passé par une extension de MBeanExporter, qui échoue à chaque fois qu'un appel de méthode MBean échoue:

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

MBeanExporter est une chose très flexible, et peut gérer de nombreuses situations différentes. Puisque vous nous avez montré aucun code d'exemple, je suppose que vous utilisez les annotations @ManagedOperation et @ManagedAttribute, puisque ceux-ci semblent être les plus communs.

Si vous avez une méthode getter annotée avec @ManagedAttribute, et que ce getter lève une exception, alors cela ne sera enregistré nulle part, il sera juste propagé au client pour qu'il le gère. C'est parfois embêtant, mais il semble qu'il n'y ait aucun moyen de le configurer pour faire autrement.

@ManagedOperation méthodes, cependant, leurs exceptions seront interceptées et enregistrées. Je ne sais pas pourquoi cette distinction est faite, mais c'est comme ça.

+0

Je n'utilisais pas des annotations - Le printemps semble par l'exportation par défaut toutes les opérations/attributs. Je vais essayer d'ajouter une annotation sur l'opération en question et voir ce que cela fait, merci. –

+0

Dans mon application, les méthodes @ManagedOperation ne sont pas interceptées et enregistrées – bla