Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-3997

Temporary file created by CachedOutputStream is not deleted after exchange is completed

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Invalid
    • None
    • 2.7.3, 2.8.0
    • None
    • None

    Description

      There seems to be an issue related to tmp file created by CachedOutputStream.

      My issue:
      1. send a SOAP request to CXF consumer with a attachment whose size is larger than 64K
      2. In my bundle, I will get the attachment by following code:

      from("cxf:bean:foobarEndpoint")
      // foobarEndpoint is defined in bundle-context.xml
      // <cxf:cxfEndpoint id="foobarEndpoint"
      // serviceClass="com.mycompany.FooBar">
      // </cxf:cxfEndpoint>
      .doTry()
      .to("log:myInboundLogRoute -> Start")
      .process(retrieveAttachment())
      .doCatch(Exception.class)
      .doFinally()
      //.process(removeAttachment())
      .end()
      .to("log:myInboundLogRoute -> End");

      private Processor retrieveAttachment() {
      return new Processor() {
      public void process(Exchange exchange) throws Exception {
      if (LOGGER.isDebugEnabled())
      LOGGER.debug("retrieveAttachment start");
      // handle attachments
      java.util.Collection<org.apache.cxf.message.Attachment> atts = PhaseInterceptorChain
      .getCurrentMessage().getAttachments();

      if (LOGGER.isDebugEnabled())

      { LOGGER.debug("retrieveAttachment done"); }

      }
      };
      }

      3. After the exchange is completed, there is a tmp file left under /tmp/cxf-tmp-***/ directory, which has the same size of attachment.
      Note:
      a. If the size of attachment < 64k, there will be no tmp file left.
      b. If in my bundle, I didn't invoke retrieveAttachment(), there will be no tmp file left.

      It seems that CachedOutputStream is not closed by CXF properly after the exchange is completed. I got some description from CachedOutputStream.java.

      037 /**
      038 * This output stream will store the content into a File if the stream context size is exceed the
      039 * THRESHOLD which's default value is 64K. The temp file will store in the temp directory, you
      040 * can configure it by setting the TEMP_DIR property. If you don't set the TEMP_DIR property,
      041 * it will choose the directory which is set by the system property of "java.io.tmpdir".
      042 * You can get a cached input stream of this stream. The temp file which is created with this
      043 * output stream will be deleted when you close this output stream or the all cached
      044 * fileInputStream is closed after the exchange is completed.
      045 */

      This issues is happening both in both fuse4.2 and fuse4.3.

      Attachments

        Activity

          People

            njiang Willem Jiang
            akarpe Ashwin J. Karpe
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: