From 044a3c549df302f3f641f2e165a48614b89d1be1 Mon Sep 17 00:00:00 2001 From: Dancovich Date: Thu, 24 Oct 2013 12:10:39 -0300 Subject: [PATCH] Resolvido bug que impedia chamadas remotas JMX devido a classloader ativado ser diferente do que carregou os recursos da aplicação. --- impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/DynamicMBeanProxy.java | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/DynamicMBeanProxy.java b/impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/DynamicMBeanProxy.java index 4b91e91..19af524 100644 --- a/impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/DynamicMBeanProxy.java +++ b/impl/extension/jmx/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/DynamicMBeanProxy.java @@ -96,9 +96,15 @@ public class DynamicMBeanProxy implements DynamicMBean { initializeMBeanInfo(); } - Management manager = Beans.getReference(Management.class); + + //Define temporariamente o classloader para o classloader que carregou a classe Management. + //Isso evita problemas onde recursos necessários para executar o ManagementController não estão disponíveis + //para o classloader da chamada JMX. + final ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader(); try{ + Thread.currentThread().setContextClassLoader( Management.class.getClassLoader() ); + Management manager = Beans.getReference(Management.class); return manager.getProperty(managedType, attribute); } catch(DemoiselleException de){ @@ -112,6 +118,10 @@ public class DynamicMBeanProxy implements DynamicMBean { throw de; } } + finally{ + //Devolve o classloader original. + Thread.currentThread().setContextClassLoader( originalClassloader ); + } } @Override @@ -123,9 +133,15 @@ public class DynamicMBeanProxy implements DynamicMBean { initializeMBeanInfo(); } - Management manager = Beans.getReference(Management.class); + + //Define temporariamente o classloader para o classloader que carregou a classe Management. + //Isso evita problemas onde recursos necessários para executar o ManagementController não estão disponíveis + //para o classloader da chamada JMX. + final ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader(); try{ + Thread.currentThread().setContextClassLoader( Management.class.getClassLoader() ); + Management manager = Beans.getReference(Management.class); manager.setProperty(managedType, attribute.getName(), attribute.getValue()); } catch(DemoiselleException de){ @@ -139,6 +155,10 @@ public class DynamicMBeanProxy implements DynamicMBean { throw de; } } + finally{ + //Devolve o classloader original. + Thread.currentThread().setContextClassLoader( originalClassloader ); + } } @Override @@ -190,14 +210,24 @@ public class DynamicMBeanProxy implements DynamicMBean { initializeMBeanInfo(); } - Management manager = Beans.getReference(Management.class); + + //Define temporariamente o classloader para o classloader que carregou a classe Management. + //Isso evita problemas onde recursos necessários para executar o ManagementController não estão disponíveis + //para o classloader da chamada JMX. + final ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader(); try{ + Thread.currentThread().setContextClassLoader( Management.class.getClassLoader() ); + Management manager = Beans.getReference(Management.class); return manager.invoke(managedType, actionName, params); } catch(DemoiselleException de){ throw new MBeanException(new Exception(de.getMessage())); } + finally{ + //Devolve o classloader original. + Thread.currentThread().setContextClassLoader( originalClassloader ); + } } /** -- libgit2 0.21.2