Gestion du classpathloader en settant le Thread.currentThread().setContextClassLoader(classLoader) dans les droolsRoute

This commit is contained in:
Nicolas Héron 2019-01-22 17:42:14 +01:00
commit 0e85f4853f

View file

@ -39,7 +39,10 @@ import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.HttpHeaders;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@Service("kieService") @Service("kieService")
public class KieServiceCommon { public class KieServiceCommon {
@ -80,25 +83,40 @@ public class KieServiceCommon {
this.marshallerHelper = new MarshallerHelper(this.server.getServerRegistry()); this.marshallerHelper = new MarshallerHelper(this.server.getServerRegistry());
} }
@PostConstruct @PostConstruct
private void initCamelBusinessRoutes() { private void initCamelBusinessRoutes() {
try { try {
String serverName = System.getProperty("org.kie.server.id"); String serverName = System.getProperty("org.kie.server.id");
List<ContainerPojoPersist> containers = containerRepository.findByServerName(serverName); List<ContainerPojoPersist> containers = containerRepository.findByServerName(serverName);
for (ContainerPojoPersist container : containers) { for (ContainerPojoPersist container : containers) {
ClassLoader localClassLoader = null;
String containerId = container.getContainerId(); String containerId = container.getContainerId();
KieContainerInstanceImpl kieContainerInstance = registry.getContainer(containerId); KieContainerInstanceImpl kieContainerInstance = registry.getContainer(containerId);
if (kieContainerInstance != null) { if (kieContainerInstance != null) {
try {
localClassLoader = Thread.currentThread()
.getContextClassLoader();
} catch (ClassCastException e) {
logger.info("GenericResource.runSession", e);
}
try {
Set<Class<?>> classes = kieContainerInstance.getExtraClasses(); Set<Class<?>> classes = kieContainerInstance.getExtraClasses();
String className = container.getClassName(); String className = container.getClassName();
Class foundClass = this.getClassFromName(classes, className); Class foundClass = this.getClassFromName(classes, className);
ClassLoader classLoader = foundClass.getClassLoader(); ClassLoader classLoader = foundClass.getClassLoader();
Class<?> theClass = classLoader.loadClass(className); Class<?> theClass = classLoader.loadClass(className);
camelContext.setApplicationContextClassLoader(classLoader); camelContext.setApplicationContextClassLoader(classLoader);
Thread.currentThread().setContextClassLoader(classLoader);
String projectName = container.getProjectName(); String projectName = container.getProjectName();
String processId = container.getProcessID(); String processId = container.getProcessID();
DroolsRouter droolsRouter = new DroolsRouter(camelContext, theClass, projectName, kieContainerInstance, processId); DroolsRouter droolsRouter = new DroolsRouter(camelContext, theClass, projectName, kieContainerInstance, processId);
camelContext.addRoutes(droolsRouter); camelContext.addRoutes(droolsRouter);
} finally {
if (localClassLoader != null) {
Thread.currentThread().setContextClassLoader(localClassLoader);
}
}
} }
} }
} catch (Exception e) { } catch (Exception e) {
@ -156,6 +174,7 @@ public class KieServiceCommon {
if (foundClass != null) { if (foundClass != null) {
ClassLoader classLoader = foundClass.getClassLoader(); ClassLoader classLoader = foundClass.getClassLoader();
Class<?> theClass = classLoader.loadClass(className); Class<?> theClass = classLoader.loadClass(className);
Thread.currentThread().setContextClassLoader(classLoader);
camelContext.setApplicationContextClassLoader(classLoader); camelContext.setApplicationContextClassLoader(classLoader);
DroolsRouter droolsRouter = new DroolsRouter(camelContext, theClass, id, kci, processID); DroolsRouter droolsRouter = new DroolsRouter(camelContext, theClass, id, kci, processID);
camelContext.addRoutes(droolsRouter); camelContext.addRoutes(droolsRouter);