Hi Franz, is this something that will be fixed in an upcoming release? Is it a bug or does it work as designed? Can we use a workaround to avoid this behaviour, for example by not deleting the temp files?
Kind regards, Geert On Tue, Apr 21, 2015 at 10:37 AM, Franz Paul Forsthofer < [email protected]> wrote: > Hello Geert, > > there is no solution yet for your problem. Currently the stream cache > file is removed at the end of the route which created the file. In > your case the stream cache file is deleted when the "direct:start" > route is finished. The wire tap runs in a separate thread and > therefore it can happen that it tries to read the cached file when it > is already deleted, especially when you have a delay in the wiretap > route ("direct:x"). > > > Regards Franz > > On Fri, Apr 17, 2015 at 6:05 PM, Geert Vanheusden > <[email protected]> wrote: > > Hi, > > > > I noticed a bug where the body (StreamCache) was already removed before > the > > exchange reached the end (in the Wiretap route). > > > > I found the following ticket > > https://issues.apache.org/jira/browse/CAMEL-8386 and code > > > https://fisheye6.atlassian.com/changelog/camel-git?cs=4661cbb94513d6047e58581b23dcd4a6fad166f7 > > but I think it still doesn't fix the Wiretap problem. > > > > Here you can find my test (executed on 2.15.1). If you disable the > > StreamCaching or remove the delay it works, enabling it again will break > > the test. > > > > ============ > > import org.apache.camel.builder.RouteBuilder; > > import org.apache.camel.component.mock.MockEndpoint; > > import org.apache.camel.impl.DefaultStreamCachingStrategy; > > import org.apache.camel.spi.StreamCachingStrategy; > > import org.apache.camel.test.junit4.CamelTestSupport; > > import org.junit.Before; > > import org.junit.Test; > > > > public class WireTapTest extends CamelTestSupport { > > > > private MockEndpoint y; > > private MockEndpoint z; > > > > @Before > > public void prepareEndpoints() { > > y = getMockEndpoint("mock:file:y"); > > z = getMockEndpoint("mock:file:z"); > > } > > > > @Test > > public void > > > testSendingAMessageUsingWiretapShouldNotDeleteStreamBeforeWiretappedExcangeIsComplete() > > throws InterruptedException { > > y.expectedMessageCount(1); > > z.expectedMessageCount(1); > > > > // test.txt should contain more than one character > > template.sendBody("direct:start", > > this.getClass().getResourceAsStream("/test.txt")); > > > > assertMockEndpointsSatisfied(); > > } > > > > @Override > > protected RouteBuilder createRouteBuilder() throws Exception { > > return new RouteBuilder() { > > @Override > > public void configure() throws Exception { > > StreamCachingStrategy streamCachingStrategy = new > > DefaultStreamCachingStrategy(); > > streamCachingStrategy.setSpoolThreshold(1); > > context.setStreamCachingStrategy(streamCachingStrategy); > > context.setStreamCaching(true); > > > > from("direct:start") > > .wireTap("direct:x") > > .to("file:y"); > > > > from("direct:x") > > .delay(2000) > > .to("file:z"); > > } > > }; > > } > > > > @Override > > public String isMockEndpoints() { > > return "(file:z|file:y)"; > > } > > } > > ============= > > > > If you run the test you can clearly see the temp file deletion followed > by > > the closed stream exception: > > > > Tried 1 to delete file: > > > /var/folders/db/brq60fqj4vb8mnx_5nlz36nw0000gn/T/camel/camel-tmp-00cd1ce2-7d44-47fe-b357-008e8146f770/cos8797132745923044996.tmp > > with result: true > > > > Cannot reset stream from file > > > /var/folders/db/brq60fqj4vb8mnx_5nlz36nw0000gn/T/camel/camel-tmp-00cd1ce2-7d44-47fe-b357-008e8146f770/cos8797132745923044996.tmp > > > > I encountered the same issue during a more complex route that does some > > splitting (zip file) and multicasting. This occurred on Camel 2.14.1 so > it > > could be fixed by https://issues.apache.org/jira/browse/CAMEL-8284 but I > > need to test this. > > > > Kind regards, > > > > Geert >
