aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>2019-10-30 15:54:56 +0100
committerChristof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>2019-10-30 16:04:03 +0100
commitfca03ea334be5eb34e919a5cc7ca8bc25d79a564 (patch)
tree6566a09b7a51ee4bf0aef3a828ba15e55d5c0166
parent5a28668a1db53cd5fe54b65aeaf88b241918c01b (diff)
downloadmoa-zs-fca03ea334be5eb34e919a5cc7ca8bc25d79a564.tar.gz
moa-zs-fca03ea334be5eb34e919a5cc7ca8bc25d79a564.tar.bz2
moa-zs-fca03ea334be5eb34e919a5cc7ca8bc25d79a564.zip
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#
-rw-r--r--src/main/java/at/gv/egiz/moazs/client/ClientFactory.java7
-rw-r--r--src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java11
-rw-r--r--src/main/java/at/gv/egiz/moazs/service/MzsService.java6
-rw-r--r--src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java83
4 files changed, 11 insertions, 96 deletions
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> T create(ClientType params, Class<T> 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> T createSoap11(ClientType params, Class<T> 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> 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;
@@ -72,6 +73,9 @@ public class MzsService implements App2MzsPortType {
private final MzsDeliveryRequestValidator validator;
@Autowired
+ private TaskExecutor taskExecutor;
+
+ @Autowired
public MzsService(DeliveryRepository repository, Consumer<String> deliveryRequestBackend,
DeliveryRequestAugmenter augmenter, Msg2MzsConverter converter,
MsgResponseSinkHub hub, MzsDeliveryRequestValidator validator) {
@@ -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 <A> return value of func.
- * @return
- */
- public static <A> A runInTheadWithClassClassLoader(Supplier<A> 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];
- }
-}