This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new e75396f CAMEL-16197: camel-cxf - Should ensure CXF attachment that
are cached to temp disk should be closed/deleted when UoW is done so CXF does
not leak files. (#5326)
e75396f is described below
commit e75396f721955b2abf3be482c850963120f960b3
Author: Manuel <[email protected]>
AuthorDate: Sat Apr 10 07:57:02 2021 +0200
CAMEL-16197: camel-cxf - Should ensure CXF attachment that are cached to
temp disk should be closed/deleted when UoW is done so CXF does not leak files.
(#5326)
---
.../apache/camel/component/cxf/CxfConsumer.java | 29 -----------------
.../apache/camel/component/cxf/CxfProducer.java | 35 ---------------------
.../camel/component/cxf/DefaultCxfBinding.java | 36 ++++++++++++++++++++++
3 files changed, 36 insertions(+), 64 deletions(-)
diff --git
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
index 0469fb1..58096c7 100644
---
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
+++
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
@@ -16,13 +16,10 @@
*/
package org.apache.camel.component.cxf;
-import java.io.InputStream;
import java.lang.reflect.Method;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import javax.activation.DataHandler;
import javax.xml.ws.WebFault;
import org.w3c.dom.Element;
@@ -30,22 +27,18 @@ import org.w3c.dom.Element;
import org.apache.camel.AsyncCallback;
import org.apache.camel.ExchangePattern;
import org.apache.camel.ExchangeTimedOutException;
-import org.apache.camel.ExtendedExchange;
import org.apache.camel.Processor;
import org.apache.camel.Suspendable;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.apache.camel.component.cxf.interceptors.UnitOfWorkCloserInterceptor;
import org.apache.camel.component.cxf.util.CxfUtils;
import org.apache.camel.support.DefaultConsumer;
-import org.apache.camel.support.SynchronizationAdapter;
-import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.apache.cxf.continuations.Continuation;
import org.apache.cxf.continuations.ContinuationProvider;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.FaultMode;
import org.apache.cxf.message.Message;
@@ -310,28 +303,6 @@ public class CxfConsumer extends DefaultConsumer
implements Suspendable {
// put the context into camelExchange
camelExchange.setProperty(CxfConstants.JAXWS_CONTEXT, context);
- // add UoW done to avoid CXF file leaks
- camelExchange.adapt(ExtendedExchange.class).addOnCompletion(new
SynchronizationAdapter() {
- @Override
- public void onDone(org.apache.camel.Exchange exchange) {
- // CXF may leak temporary cached attachments to temp
folder that has not been in use
- Collection<Attachment> atts =
cxfExchange.getInMessage().getAttachments();
- if (atts != null) {
- for (Attachment att : atts) {
- DataHandler dh = att.getDataHandler();
- if (dh != null) {
- try {
- InputStream is = dh.getInputStream();
- IOHelper.close(is);
- } catch (Exception e) {
- // ignore
- }
- }
- }
- }
- }
- });
-
// we want to handle the UoW
try {
CxfConsumer.this.createUoW(camelExchange);
diff --git
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
index b100d45..464e16f 100644
---
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
+++
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
@@ -25,21 +25,16 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
-import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import javax.xml.ws.Holder;
import javax.xml.ws.handler.MessageContext.Scope;
import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
-import org.apache.camel.ExtendedExchange;
import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.attachment.AttachmentMessage;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.apache.camel.support.DefaultAsyncProducer;
-import org.apache.camel.support.SynchronizationAdapter;
import org.apache.camel.support.service.ServiceHelper;
-import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.apache.cxf.Bus;
import org.apache.cxf.binding.soap.model.SoapHeaderInfo;
@@ -117,8 +112,6 @@ public class CxfProducer extends DefaultAsyncProducer {
invocationContext.put(Client.RESPONSE_CONTEXT, responseContext);
invocationContext.put(Client.REQUEST_CONTEXT,
prepareRequest(camelExchange, cxfExchange));
- addAttachmentFileCloseUoW(camelExchange);
-
CxfClientCallback cxfClientCallback = new
CxfClientCallback(callback, camelExchange, cxfExchange, boi, endpoint);
// send the CXF async request
client.invoke(cxfClientCallback, boi, getParams(endpoint,
camelExchange),
@@ -157,8 +150,6 @@ public class CxfProducer extends DefaultAsyncProducer {
invocationContext.put(Client.REQUEST_CONTEXT,
prepareRequest(camelExchange, cxfExchange));
try {
- addAttachmentFileCloseUoW(camelExchange);
-
// send the CXF request
client.invoke(boi, getParams(endpoint, camelExchange),
invocationContext, cxfExchange);
@@ -189,32 +180,6 @@ public class CxfProducer extends DefaultAsyncProducer {
}
}
- private void addAttachmentFileCloseUoW(Exchange camelExchange) {
- // add UoW done to avoid CXF file leaks
- camelExchange.adapt(ExtendedExchange.class).addOnCompletion(new
SynchronizationAdapter() {
- @Override
- public void onDone(org.apache.camel.Exchange exchange) {
- // CXF may leak temporary cached attachments to temp folder
that has not been in use
- AttachmentMessage am =
exchange.getMessage(AttachmentMessage.class);
- if (am != null) {
- Map<String, DataHandler> atts = am.getAttachments();
- if (atts != null) {
- for (DataHandler dh : atts.values()) {
- if (dh != null) {
- try {
- InputStream is = dh.getInputStream();
- IOHelper.close(is);
- } catch (Exception e) {
- // ignore
- }
- }
- }
- }
- }
- }
- });
- }
-
protected Map<String, Object> prepareRequest(Exchange camelExchange,
org.apache.cxf.message.Exchange cxfExchange)
throws Exception {
diff --git
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
index ffcfb27..ff87f1e 100644
---
a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
+++
b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Modifier;
import java.nio.charset.Charset;
import java.security.Principal;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -31,6 +32,7 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
+import javax.activation.DataHandler;
import javax.security.auth.Subject;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
@@ -46,6 +48,7 @@ import org.w3c.dom.Node;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
import org.apache.camel.ExchangePropertyKey;
+import org.apache.camel.ExtendedExchange;
import org.apache.camel.attachment.AttachmentMessage;
import org.apache.camel.attachment.DefaultAttachment;
import org.apache.camel.component.cxf.common.header.CxfHeaderHelper;
@@ -54,6 +57,8 @@ import org.apache.camel.component.cxf.util.ReaderInputStream;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.spi.HeaderFilterStrategyAware;
import org.apache.camel.support.ExchangeHelper;
+import org.apache.camel.support.SynchronizationAdapter;
+import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.apache.cxf.attachment.AttachmentImpl;
import org.apache.cxf.binding.soap.Soap11;
@@ -201,6 +206,36 @@ public class DefaultCxfBinding implements CxfBinding,
HeaderFilterStrategyAware
createCamelAttachment(attachment));
}
}
+ addAttachmentFileCloseUoW(camelExchange, cxfExchange);
+ }
+
+ /**
+ * CXF may cache attachments in the filesystem temp folder. The files may
leak if they were not used. Add a cleanup
+ * handler to remove the attachments after message processing.
+ *
+ * @param camelExchange
+ * @param cxfExchange
+ */
+ private void addAttachmentFileCloseUoW(Exchange camelExchange,
org.apache.cxf.message.Exchange cxfExchange) {
+ camelExchange.adapt(ExtendedExchange.class).addOnCompletion(new
SynchronizationAdapter() {
+ @Override
+ public void onDone(org.apache.camel.Exchange exchange) {
+ Collection<Attachment> atts =
cxfExchange.getInMessage().getAttachments();
+ if (atts != null) {
+ for (Attachment att : atts) {
+ DataHandler dh = att.getDataHandler();
+ if (dh != null) {
+ try {
+ InputStream is = dh.getInputStream();
+ IOHelper.close(is);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+ });
}
private DefaultAttachment createCamelAttachment(Attachment attachment) {
@@ -319,6 +354,7 @@ public class DefaultCxfBinding implements CxfBinding,
HeaderFilterStrategyAware
createCamelAttachment(attachment));
}
}
+ addAttachmentFileCloseUoW(camelExchange, cxfExchange);
}
/**