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 be48a6a 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.
be48a6a is described below
commit be48a6a79392986d29b44b751424d66d582539ba
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Mar 31 07:06:09 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.
---
.../apache/camel/component/cxf/CxfProducer.java | 38 +++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
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 bc4eada..b100d45 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,16 +25,21 @@ 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;
@@ -112,6 +117,8 @@ 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),
@@ -150,6 +157,8 @@ 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);
@@ -168,9 +177,10 @@ public class CxfProducer extends DefaultAsyncProducer {
cxfHeaders);
}
} catch (IOException e) {
- LOG.error("Cannot store cookies", e);
+ LOG.warn("Cannot store cookies. This exception is
ignored.", e);
}
}
+
// bind the CXF response to Camel exchange
if (!boi.getOperationInfo().isOneWay()) {
endpoint.getCxfBinding().populateExchangeFromCxfResponse(camelExchange,
cxfExchange,
@@ -179,6 +189,32 @@ 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 {