Commit 044a3c549df302f3f641f2e165a48614b89d1be1

Authored by Dancovich
1 parent 07af24ef
Exists in master

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
... ... @@ -96,9 +96,15 @@ public class DynamicMBeanProxy implements DynamicMBean {
96 96 initializeMBeanInfo();
97 97 }
98 98  
99   - Management manager = Beans.getReference(Management.class);
  99 +
  100 + //Define temporariamente o classloader para o classloader que carregou a classe Management.
  101 + //Isso evita problemas onde recursos necessários para executar o ManagementController não estão disponíveis
  102 + //para o classloader da chamada JMX.
  103 + final ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader();
100 104  
101 105 try{
  106 + Thread.currentThread().setContextClassLoader( Management.class.getClassLoader() );
  107 + Management manager = Beans.getReference(Management.class);
102 108 return manager.getProperty(managedType, attribute);
103 109 }
104 110 catch(DemoiselleException de){
... ... @@ -112,6 +118,10 @@ public class DynamicMBeanProxy implements DynamicMBean {
112 118 throw de;
113 119 }
114 120 }
  121 + finally{
  122 + //Devolve o classloader original.
  123 + Thread.currentThread().setContextClassLoader( originalClassloader );
  124 + }
115 125 }
116 126  
117 127 @Override
... ... @@ -123,9 +133,15 @@ public class DynamicMBeanProxy implements DynamicMBean {
123 133 initializeMBeanInfo();
124 134 }
125 135  
126   - Management manager = Beans.getReference(Management.class);
  136 +
  137 + //Define temporariamente o classloader para o classloader que carregou a classe Management.
  138 + //Isso evita problemas onde recursos necessários para executar o ManagementController não estão disponíveis
  139 + //para o classloader da chamada JMX.
  140 + final ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader();
127 141  
128 142 try{
  143 + Thread.currentThread().setContextClassLoader( Management.class.getClassLoader() );
  144 + Management manager = Beans.getReference(Management.class);
129 145 manager.setProperty(managedType, attribute.getName(), attribute.getValue());
130 146 }
131 147 catch(DemoiselleException de){
... ... @@ -139,6 +155,10 @@ public class DynamicMBeanProxy implements DynamicMBean {
139 155 throw de;
140 156 }
141 157 }
  158 + finally{
  159 + //Devolve o classloader original.
  160 + Thread.currentThread().setContextClassLoader( originalClassloader );
  161 + }
142 162 }
143 163  
144 164 @Override
... ... @@ -190,14 +210,24 @@ public class DynamicMBeanProxy implements DynamicMBean {
190 210 initializeMBeanInfo();
191 211 }
192 212  
193   - Management manager = Beans.getReference(Management.class);
  213 +
  214 + //Define temporariamente o classloader para o classloader que carregou a classe Management.
  215 + //Isso evita problemas onde recursos necessários para executar o ManagementController não estão disponíveis
  216 + //para o classloader da chamada JMX.
  217 + final ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader();
194 218  
195 219 try{
  220 + Thread.currentThread().setContextClassLoader( Management.class.getClassLoader() );
  221 + Management manager = Beans.getReference(Management.class);
196 222 return manager.invoke(managedType, actionName, params);
197 223 }
198 224 catch(DemoiselleException de){
199 225 throw new MBeanException(new Exception(de.getMessage()));
200 226 }
  227 + finally{
  228 + //Devolve o classloader original.
  229 + Thread.currentThread().setContextClassLoader( originalClassloader );
  230 + }
201 231 }
202 232  
203 233 /**
... ...