From fca03ea334be5eb34e919a5cc7ca8bc25d79a564 Mon Sep 17 00:00:00 2001 From: Christof Rabensteiner Date: Wed, 30 Oct 2019 15:54:56 +0100 Subject: Remove JAXB Class Not Found Fix - Problem: Apparently I used the wrong executor when supplying the backend tasks via CompletableFuture.supplyAsync(). This method relies on ForkJoinPool.commonPool(), and threads in this pool are not configured correctly? - Solution: Use spring-boots auto-configured TaskExecutor. - More Information on this issue can be found here: https://issues.apache.org/jira/browse/CXF-8100# --- .../at/gv/egiz/moazs/client/ClientFactory.java | 7 +- .../java/at/gv/egiz/moazs/scheme/Marshaller.java | 11 +-- .../java/at/gv/egiz/moazs/service/MzsService.java | 6 +- .../gv/egiz/moazs/util/JAXBClassNotFoundFix.java | 83 ---------------------- 4 files changed, 11 insertions(+), 96 deletions(-) delete mode 100644 src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java (limited to 'src/main/java/at') diff --git a/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java b/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java index 04eedab..a14e693 100644 --- a/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java +++ b/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java @@ -23,7 +23,6 @@ package at.gv.egiz.moazs.client; import at.gv.egiz.moazs.preprocess.ConfigUtil; import at.gv.egiz.moazs.util.FileUtils; -import at.gv.egiz.moazs.util.JAXBClassNotFoundFix; import at.gv.egiz.moazs.util.StoreSOAPBodyBinaryInRepositoryInterceptor; import at.gv.zustellung.app2mzs.xsd.ClientType; import at.gv.zustellung.app2mzs.xsd.KeyStoreType; @@ -42,9 +41,9 @@ import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; -import javax.annotation.Nullable; import javax.net.ssl.SSLContext; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.SOAPBinding; @@ -86,7 +85,7 @@ public class ClientFactory { * @return the client */ public T create(ClientType params, Class clazz) { - return JAXBClassNotFoundFix.runInTheadWithClassClassLoader(() -> create(params, clazz, true)); + return create(params, clazz, true); } /** @@ -96,7 +95,7 @@ public class ClientFactory { * @return the client */ public T createSoap11(ClientType params, Class clazz) { - return JAXBClassNotFoundFix.runInTheadWithClassClassLoader(() -> create(params, clazz, false)); + return create(params, clazz, false); } diff --git a/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java b/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java index 3c144d4..8722cf4 100644 --- a/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java +++ b/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java @@ -30,8 +30,6 @@ import java.io.InputStream; import java.io.StringWriter; import java.util.HashMap; -import static at.gv.egiz.moazs.util.JAXBClassNotFoundFix.runInTheadWithClassClassLoader; - /** * @author xerx593 * Source: https://stackoverflow.com/questions/44676532/how-to-use-spring-to-marshal-and-unmarshal-xml @@ -63,14 +61,11 @@ public class Marshaller { StringWriter sw = new StringWriter(); Result result = new StreamResult(sw); - return runInTheadWithClassClassLoader(() -> { - jaxbMarshaller.marshal(obj, result); - return sw.toString(); - }); + jaxbMarshaller.marshal(obj, result); + return sw.toString(); } public T unmarshallXml(final InputStream xml) { - return runInTheadWithClassClassLoader( - () -> (T) jaxbMarshaller.unmarshal(new StreamSource(xml))); + return (T) jaxbMarshaller.unmarshal(new StreamSource(xml)); } } diff --git a/src/main/java/at/gv/egiz/moazs/service/MzsService.java b/src/main/java/at/gv/egiz/moazs/service/MzsService.java index d9c81f3..55f0554 100644 --- a/src/main/java/at/gv/egiz/moazs/service/MzsService.java +++ b/src/main/java/at/gv/egiz/moazs/service/MzsService.java @@ -34,6 +34,7 @@ import org.apache.cxf.annotations.SchemaValidation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Service; import javax.jws.WebParam; @@ -71,6 +72,9 @@ public class MzsService implements App2MzsPortType { private final MsgResponseSinkHub hub; private final MzsDeliveryRequestValidator validator; + @Autowired + private TaskExecutor taskExecutor; + @Autowired public MzsService(DeliveryRepository repository, Consumer deliveryRequestBackend, DeliveryRequestAugmenter augmenter, Msg2MzsConverter converter, @@ -93,7 +97,7 @@ public class MzsService implements App2MzsPortType { validator.isRequestValid(completeRequest); - var requestProcessed = supplyAsync(() -> process(completeRequest)); + var requestProcessed = supplyAsync(() -> process(completeRequest), taskExecutor); try { var serviceTimeout = completeRequest.getConfig().getServiceTimeout(); diff --git a/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java b/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java deleted file mode 100644 index 22f8b1e..0000000 --- a/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright 2019 Graz University of Technology - * MOA ZS has been developed in a cooperation between EGIZ - * and Graz University of Technology. - * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * https://joinup.ec.europa.eu/news/understanding-eupl-v12 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - *******************************************************************************/ -package at.gv.egiz.moazs.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.function.Supplier; - -import static at.gv.egiz.moazs.MoaZSException.moaZSException; - -/** - * @author Christof Rabensteiner - * - */ -@Component -public class JAXBClassNotFoundFix { - - private static final Logger log = LoggerFactory.getLogger(JAXBClassNotFoundFix.class); - - private JAXBClassNotFoundFix() {} - - /** - * Solves JAXB's "ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory" in Java >= 9 - * by running func in a dedicated thread which has its context classloader replaced with a classloader that finds - * the ContextFactory. - * - * See https://sjhannah.com/blog/2018/11/21/jaxb-hell-on-jdk-9/ - * Note: "runInTheadWithClassClassLoader" is not a typo. - * @param func function that is called in a dedicated thread. - * @param return value of func. - * @return - */ - public static A runInTheadWithClassClassLoader(Supplier func) { - - final Object[] result = new Object[1]; - final Exception[] error = new Exception[1]; - - Thread t = new Thread(() -> { - try { - result[0] = func.get(); - } catch (Exception ex) { - error[0] = ex; - } - }); - - t.setContextClassLoader(JAXBClassNotFoundFix.class.getClassLoader()); - t.start(); - - try { - t.join(); - } catch (InterruptedException ex) { - log.error("Interrupted. ", ex); - Thread.currentThread().interrupt(); - } - - if (error[0] != null) { - throw moaZSException("Could not run function.", error[0]); - } - - return (A)result[0]; - } -} -- cgit v1.2.3