Author: davsclaus
Date: Wed Jul 14 08:09:58 2010
New Revision: 963966
URL: http://svn.apache.org/viewvc?rev=963966&view=rev
Log:
CAMEL-2944: Fixed issue with stream cache spooled to files on Windows and
deleting the temporary files when Exchange done
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/FileInputStreamCacheTest.java
camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java
camel/trunk/camel-core/src/test/resources/log4j.properties
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java?rev=963966&r1=963965&r2=963966&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/CachedOutputStream.java
Wed Jul 14 08:09:58 2010
@@ -25,8 +25,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
import org.apache.camel.Exchange;
import org.apache.camel.StreamCache;
@@ -54,9 +52,7 @@ public class CachedOutputStream extends
private boolean inMemory = true;
private int totalLength;
private File tempFile;
- private boolean exchangeOnCompleted;
-
- private List<FileInputStreamCache> fileInputStreamCaches = new
ArrayList<FileInputStreamCache>(4);
+ private FileInputStreamCache fileInputStreamCache;
private long threshold = 64 * 1024;
private File outputDir;
@@ -76,12 +72,10 @@ public class CachedOutputStream extends
@Override
public void onDone(Exchange exchange) {
try {
- //set the flag so we can delete the temp file
- exchangeOnCompleted = true;
- if (fileInputStreamCaches.size() == 0) {
- // there is no open fileInputStream let's close it
- close();
+ if (fileInputStreamCache != null) {
+ fileInputStreamCache.close();
}
+ close();
} catch (Exception e) {
LOG.warn("Error deleting temporary cache file: " +
tempFile, e);
}
@@ -150,9 +144,10 @@ public class CachedOutputStream extends
}
} else {
try {
- FileInputStreamCache answer = new
FileInputStreamCache(tempFile, this);
- fileInputStreamCaches.add(answer);
- return answer;
+ if (fileInputStreamCache == null) {
+ fileInputStreamCache = new FileInputStreamCache(tempFile);
+ }
+ return fileInputStreamCache;
} catch (FileNotFoundException e) {
throw IOHelper.createIOException("Cached file " + tempFile + "
not found", e);
}
@@ -171,23 +166,16 @@ public class CachedOutputStream extends
}
} else {
try {
- FileInputStreamCache answer = new
FileInputStreamCache(tempFile, this);
- fileInputStreamCaches.add(answer);
- return answer;
+ if (fileInputStreamCache == null) {
+ fileInputStreamCache = new FileInputStreamCache(tempFile);
+ }
+ return fileInputStreamCache;
} catch (FileNotFoundException e) {
throw IOHelper.createIOException("Cached file " + tempFile + "
not found", e);
}
}
}
-
- public void releaseFileInputStream(FileInputStreamCache
fileInputStreamCache) throws IOException {
- fileInputStreamCaches.remove(fileInputStreamCache);
- if (exchangeOnCompleted && fileInputStreamCaches.size() == 0) {
- // now we can close stream and delete the temp file
- close();
- }
- }
-
+
private void cleanUpTempFile() {
// cleanup temporary file
if (tempFile != null) {
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java?rev=963966&r1=963965&r2=963966&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/stream/FileInputStreamCache.java
Wed Jul 14 08:09:58 2010
@@ -16,6 +16,7 @@
*/
package org.apache.camel.converter.stream;
+import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -27,42 +28,31 @@ import org.apache.camel.RuntimeCamelExce
import org.apache.camel.StreamCache;
import org.apache.camel.util.IOHelper;
-public class FileInputStreamCache extends InputStream implements StreamCache {
+public class FileInputStreamCache extends InputStream implements StreamCache,
Closeable {
private InputStream stream;
- private CachedOutputStream cachedOutputStream;
private File file;
- public FileInputStreamCache(File file, CachedOutputStream cos) throws
FileNotFoundException {
+ public FileInputStreamCache(File file) throws FileNotFoundException {
this.file = file;
- this.cachedOutputStream = cos;
this.stream = new FileInputStream(file);
}
@Override
public void close() {
- try {
- if (isSteamOpened()) {
- getInputStream().close();
- }
- // Just remove the itself from cachedOutputStream
- if (cachedOutputStream != null) {
- cachedOutputStream.releaseFileInputStream(this);
- }
- } catch (Exception e) {
- throw new RuntimeCamelException(e);
+ if (isSteamOpened()) {
+ IOHelper.close(getInputStream());
}
}
@Override
public void reset() {
try {
- if (isSteamOpened()) {
- getInputStream().close();
- }
+ // reset by closing and creating a new stream based on the file
+ close();
// reset by creating a new stream based on the file
stream = new FileInputStream(file);
} catch (Exception e) {
- throw new RuntimeCamelException(e);
+ throw new RuntimeCamelException("Cannot reset stream from file " +
file, e);
}
}
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java?rev=963966&r1=963965&r2=963966&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
Wed Jul 14 08:09:58 2010
@@ -165,6 +165,9 @@ public class DefaultTypeConverter extend
// try to find a suitable type converter
TypeConverter converter = getOrFindTypeConverter(type, value);
if (converter != null) {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Using converter: " + converter + " to convert " +
key);
+ }
Object rc = converter.convertTo(type, exchange, value);
if (rc != null) {
return rc;
Modified:
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/FileInputStreamCacheTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/FileInputStreamCacheTest.java?rev=963966&r1=963965&r2=963966&view=diff
==============================================================================
---
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/FileInputStreamCacheTest.java
(original)
+++
camel/trunk/camel-core/src/test/java/org/apache/camel/converter/stream/FileInputStreamCacheTest.java
Wed Jul 14 08:09:58 2010
@@ -33,9 +33,8 @@ public class FileInputStreamCacheTest ex
public void testFileInputStreamCache() throws Exception {
Exchange exchange = new DefaultExchange(context);
- CachedOutputStream cos = new CachedOutputStream(exchange);
File file = new File(TEST_FILE).getAbsoluteFile();
- FileInputStreamCache cache = new FileInputStreamCache(file, cos);
+ FileInputStreamCache cache = new FileInputStreamCache(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
cache.writeTo(bos);
Modified:
camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java?rev=963966&r1=963965&r2=963966&view=diff
==============================================================================
---
camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java
(original)
+++
camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java
Wed Jul 14 08:09:58 2010
@@ -89,8 +89,6 @@ public class EventNotifierRedeliveryEven
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
- Thread.sleep(1000);
-
assertEquals(9, events.size());
assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(0));
@@ -112,7 +110,7 @@ public class EventNotifierRedeliveryEven
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
-
errorHandler(deadLetterChannel("mock:dead").maximumRedeliveries(4).asyncDelayedRedelivery().redeliveryDelay(25));
+
errorHandler(deadLetterChannel("mock:dead").maximumRedeliveries(4).asyncDelayedRedelivery().redeliveryDelay(100));
from("direct:start").throwException(new
IllegalArgumentException("Damn"));
}
@@ -123,6 +121,8 @@ public class EventNotifierRedeliveryEven
template.sendBody("direct:start", "Hello World");
assertMockEndpointsSatisfied();
+ Thread.sleep(500);
+
assertEquals(9, events.size());
assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(0));
@@ -135,9 +135,8 @@ public class EventNotifierRedeliveryEven
e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(4));
assertEquals(4, e.getAttempt());
assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(5));
- assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(6));
- assertIsInstanceOf(ExchangeSentEvent.class, events.get(7));
- assertIsInstanceOf(ExchangeSentEvent.class, events.get(8));
+
+ // since its async the ordering of the rest can be different depending
per OS and timing
}
}
\ No newline at end of file
Modified: camel/trunk/camel-core/src/test/resources/log4j.properties
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/log4j.properties?rev=963966&r1=963965&r2=963966&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/resources/log4j.properties (original)
+++ camel/trunk/camel-core/src/test/resources/log4j.properties Wed Jul 14
08:09:58 2010
@@ -40,6 +40,8 @@ log4j.logger.org.apache.camel.impl.conve
log4j.logger.org.apache.camel.management=WARN
log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
#log4j.logger.org.apache.camel.impl=TRACE
+#log4j.logger.org.apache.camel.util.FileUtil=TRACE
+#log4j.logger.org.apache.camel.impl.converter.DefaultTypeConverter=TRACE
# CONSOLE appender not used by default
log4j.appender.out=org.apache.log4j.ConsoleAppender