The sendTemplate.sendBody() is a sync API and it will return if the ftp
uploading processor is finished.
So your main method could be
// create context
CamelContext context = new DefaultCamelContext();
// create consumer and producer template
ConsumerTemplate consumer = context.createConsumerTemplate();
ProducerTemplate producer = context.createProducerTemplate();
// loop to empty file directory
while (true) {
// receive the message from the file directory, wait at most 3 sec
Exchange exchange =
consumer.receive("file:c:\\uploadfiles?noop=true", 3000);
if (msg == null) {
// no more messages in queue
break;
}
// You can do the message transformation here
// send it to the ftp endpoint
Exchange result = producer.send("FTP URI", exchange);
// You may check the result state to see if there is any
exception is thrown
}
Willem
Hebert Hu wrote:
I looked into the example and still uncertain about how to check whether the
sendTemplate is returned. Would you please show me a code snippet?
willem.jiang wrote:
If you are using file endpoint to pull the directory, it is hard to tell
if the uploading processor is over,
Can you take look at the camel polling consumer API[1] (Timer based
polling consumer example), in this way you can add you logic to check if
the file pulling is finished, and the sendTemplate will return when the
uploading work is over.
[1]http://camel.apache.org/polling-consumer.html
Willem
Hebert Hu wrote:
I started the upload like this
CamelContext context = new DefaultCamelContext();
RouteBuilder route = createRouteBuilder();
context.addRoutes(route);
context.start();
I'm able to get the route service status by
RouteDefinition definition = context.getRouteDefinitions().get(0);
context.getRouteStatus(definition)
But how can I tell whther the upload is finished?
As I always get "Started" even the upload is finished.
Hebert Hu wrote:
Hi,
I've encountered a strange problem when using Camel Sftp component for
uploading.
Here's my code
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
public void configure() throws Exception {
from("file:c:\\uploadfiles?noop=true").to(getFtpUrl());
from(getFtpUrl()).to("mock:result");
}
};
}
private String getFtpUrl(){
return
"sftp://usern...@sftpserver/ftpload?password=password&binary=true&knownHostsFile=c://.ssh//known_hosts";
}
The problem is: When I start my upload procedure, for the files in the
c:\uploadfiles (multiples files), some of them will create a .camellock
file while others not. As in the remote server, some of the files that
have a .camellock copy will be uploaded while others not. Noted that not
all the files that has .camellock copies will be uploaded. And an
exception is thrown
SEVERE: Cannot retrieve file: ftpload/a.txt
org.apache.camel.component.file.GenericFileOperationFailedException:
Cannot retrieve file: ftpload/a.txt
at
org.apache.camel.component.file.remote.SftpOperations.retrieveFileToStreamInBody(SftpOperations.java:326)
at
org.apache.camel.component.file.remote.SftpOperations.retrieveFile(SftpOperations.java:312)
at
org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:183)
at
org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:120)
at
org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:93)
at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:99)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:432)
at
java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:295)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:80)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:157)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:181)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Thread.java:799)
When I run the upload procedure again, more .camellock files appeared,
more files been uploaded, and the exception is still thrown.
For example. 10 files in c:\uploadfiles, run the upload for the first
time, 5 .camellock appeared, 1 file with .camellock uploaded, and an
exception. Run for the second time, 2 more .camellock appeared, 1 more
file uploaded, and an exception again.
I'm using Camel-core 2.0.0, camel-ftp 2.0.0
Can any one shed some light on me?