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 543a1f3  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.
543a1f3 is described below

commit 543a1f3f0d0e782b1bd61d6d4e98b6b831746546
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Mar 24 19:54:57 2021 +0100

    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/CxfConsumer.java    | 29 ++++++++++++++++++++++
 1 file changed, 29 insertions(+)

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 58096c7..0469fb1 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,10 +16,13 @@
  */
 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;
@@ -27,18 +30,22 @@ 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;
@@ -303,6 +310,28 @@ 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);

Reply via email to