I've been playing around with Camel's FileComponent. I started with
camel-example-spring, and modified MyRouteBuilder to look like so:
public class MyRouteBuilder extends RouteBuilder {
public void configure() {
from("file:/tmp/test/incoming/").to("file:/tmp/test/outgoing/");
}
}
Putting a file in the "incoming" directory then results in this:
org.apache.camel.InvalidTypeException: Could not convert value:
[EMAIL PROTECTED] to type: java.nio.ByteBuffer but has
value: [EMAIL PROTECTED] of type:
java.io.BufferedInputStream on the exchange: Exchange[FileMessage:
/tmp/test/incoming/foo.lock]
at
org.apache.camel.util.ExchangeHelper.convertToMandatoryType(ExchangeHelper.java:91)
at
org.apache.camel.component.file.FileProducer.process(FileProducer.java:57)
at
org.apache.camel.component.file.FileProducer.process(FileProducer.java:50)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:65)
at
org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:78)
at
org.apache.camel.component.file.FileConsumer.pollFile(FileConsumer.java:81)
at
org.apache.camel.component.file.FileConsumer.pollFileOrDirectory(FileConsumer.java:51)
at
org.apache.camel.component.file.FileConsumer.pollFileOrDirectory(FileConsumer.java:58)
at
org.apache.camel.component.file.FileConsumer.poll(FileConsumer.java:45)
at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:63)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
at
java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:280)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:135)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:65)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:142)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:166)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:613)
This extra if block in FileProducer confuses me because it seems like
there's no InputStream to ByteBuffer conversion:
ByteBuffer payload = exchange.getIn().getBody(ByteBuffer.class);
if (payload == null) {
InputStream in = ExchangeHelper.getMandatoryInBody(exchange,
InputStream.class);
payload = ExchangeHelper.convertToMandatoryType(exchange,
ByteBuffer.class, in);
}
Adding the following File to ByteBuffer conversion to NIOConverter does
the trick:
@Converter
public static ByteBuffer toByteBuffer(File file) throws IOException {
byte[] buf = new byte[(int) file.length()];
InputStream in = new BufferedInputStream(new FileInputStream(file));
in.read(buf);
return ByteBuffer.wrap(buf);
}
Hope this helps!
- aaron