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,28 +83,43 @@ 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) {
logger.info("CreationContainer", e); logger.info("CreationContainer", e);
} }
} }
@ -133,12 +151,12 @@ public class KieServiceCommon {
} }
public KieContainerResource createContainerWithRestBusinessService(String id, KieContainerResource container, String className,String processID) { public KieContainerResource createContainerWithRestBusinessService(String id, KieContainerResource container, String className, String processID) {
KieContainerResource containerResource = this.createContainer(id, container); KieContainerResource containerResource = this.createContainer(id, container);
if (containerResource.getMessages().size()==1 if (containerResource.getMessages().size() == 1
&& containerResource.getMessages().get(0).getSeverity()!= null && containerResource.getMessages().get(0).getSeverity() != null
&& containerResource.getMessages().get(0).getSeverity().equals(Severity.INFO)) { && containerResource.getMessages().get(0).getSeverity().equals(Severity.INFO)) {
ClassLoader localClassLoader = null; ClassLoader localClassLoader = null;
@ -156,12 +174,13 @@ 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);
String serverName= System.getProperty("org.kie.server.id"); String serverName = System.getProperty("org.kie.server.id");
ContainerPojoPersist containerPojoPersist = containerRepository.findByServerNameAndContainerId(serverName,id); ContainerPojoPersist containerPojoPersist = containerRepository.findByServerNameAndContainerId(serverName, id);
if (containerPojoPersist==null){ if (containerPojoPersist == null) {
containerPojoPersist = new ContainerPojoPersist(); containerPojoPersist = new ContainerPojoPersist();
containerPojoPersist.setId(UUID.randomUUID().toString()); containerPojoPersist.setId(UUID.randomUUID().toString());
containerPojoPersist.setContainerId(id); containerPojoPersist.setContainerId(id);
@ -170,7 +189,7 @@ public class KieServiceCommon {
containerPojoPersist.setServerName(serverName); containerPojoPersist.setServerName(serverName);
containerPojoPersist.setProcessID(processID); containerPojoPersist.setProcessID(processID);
containerRepository.save(containerPojoPersist); containerRepository.save(containerPojoPersist);
}else{ } else {
containerPojoPersist.setContainerId(id); containerPojoPersist.setContainerId(id);
containerPojoPersist.setClassName(className); containerPojoPersist.setClassName(className);
containerPojoPersist.setProjectName(id); containerPojoPersist.setProjectName(id);
@ -238,7 +257,7 @@ public class KieServiceCommon {
ServiceResponse<Void> result = server.disposeContainer(id); ServiceResponse<Void> result = server.disposeContainer(id);
String serverName = System.getProperty("org.kie.server.id"); String serverName = System.getProperty("org.kie.server.id");
ContainerPojoPersist element = containerRepository.findByServerNameAndContainerId(serverName, id); ContainerPojoPersist element = containerRepository.findByServerNameAndContainerId(serverName, id);
if (element!= null){ if (element != null) {
containerRepository.delete(element); containerRepository.delete(element);
} }
return result; return result;