Hi everyone!
I have a connection problem when stopping a ftp route. My route is
something like this:













*<routes xmlns="http://camel.apache.org/schema/spring
<http://camel.apache.org/schema/spring>">    <route id="jobIdFtp_1">
<from
uri="ftp://admin@localhost:2121/testFolder?move=.done&amp;moveFailed=.error&amp;delay=3000000&amp;recursive=true&amp;antInclude=**&amp;password=admin&amp;download=true&amp;binary=true&amp;passiveMode=true&amp;sendEmptyMessageWhenIdle=true&amp;maxMessagesPerPoll=1000&amp;readLockDeleteOrphanLockFiles=false&amp;autoCreate=false&amp;localWorkDirectory=C:\Users\Test\Desktop\testAcquisition&amp;throwExceptionOnConnectFailed=true&amp;consumer.bridgeErrorHandler=true"/>
    <to uri="bean:myProcessor"/>        <choice>
<when>
<simple>${exchangeProperty.CamelBatchComplete}</simple>                <to
uri="bean:stopRouteProcessor"/>            </when>        </choice>
</route></routes>*
where *stopRouteProcessor *is a prcessor that stops the route just as
reported in the documentation
public void process(final Exchange exchange) throws Exception {
        Thread stop = new Thread() {
            @Override
            public void run() {
                String routeId = exchange.getFromRouteId();
                try {
                    SpringCamelContext exchangeContext =
(SpringCamelContext) exchange.getContext();
                    RouteDefinition routeDefinition =
exchangeContext.getRouteDefinition(routeId);

exchangeContext.stopRoute(routeId);

exchangeContext.removeRoute(routeId);

exchangeContext.removeRouteDefinition(routeDefinition);

                } catch (Exception e) {
                    ....
                }
            }
        };
        // start the thread that stops this route
        stop.start();
    }

The route is correctly stopped, but I receive a connection problem when
Camel tries to move on the server the last acquired file, because the
connection is already closed, just because of the route stop (in fact, if I
remove the stopRouteProcessor everything works fine).
2019-01-11 16:53:24,303 | lMediaProcessorQueue | WARN  |
GenericFileOnCompletion                  | Error during commit.
Exchange[ID-User-NBK-50955-1547221992014-0-6][Message: [Body is file based:
C:\Users\Test\Desktop\testAcquisition\mioFile.txt]]. Caused by:
[org.apache.camel.component.file.GenericFileOperationFailedException - File
operation failed: null Connection is not open. Code: 221]
org.apache.camel.component.file.GenericFileOperationFailedException: File
operation failed: null Connection is not open. Code: 221
    at
org.apache.camel.component.file.remote.FtpOperations.buildDirectory(FtpOperations.java:304)
    at
org.apache.camel.component.file.strategy.GenericFileProcessStrategySupport.renameFile(GenericFileProcessStrategySupport.java:106)
    at
org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy.commit(GenericFileRenameProcessStrategy.java:88)
    at
org.apache.camel.component.file.GenericFileOnCompletion.processStrategyCommit(GenericFileOnCompletion.java:127)
    at
org.apache.camel.component.file.GenericFileOnCompletion.onCompletion(GenericFileOnCompletion.java:83)
    at
org.apache.camel.component.file.GenericFileOnCompletion.onComplete(GenericFileOnCompletion.java:57)
    at
org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations(UnitOfWorkHelper.java:104)
    at
org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWork.java:229)
    at
org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:65)
    at
org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:653)
    at
org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:608)
    at
org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:239)
    at
org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:250)
    at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:491)
    at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
    at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
    at
org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:298)
    at
org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:207)
    at
org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:154)
    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Connection is not open
    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:472)
    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:537)
    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:586)
    at org.apache.commons.net.ftp.FTP.pwd(FTP.java:1381)
    at
org.apache.commons.net.ftp.FTPClient.printWorkingDirectory(FTPClient.java:1990)
    at
org.apache.camel.component.file.remote.FtpOperations.buildDirectory(FtpOperations.java:281)
    ... 21 common frames omitted

Now, I know that onCompletion is executed in a separated thread, but is
there a way to know if/when onCompletion is executed for the last exchange,
so I can stop the route only after that? If this is not possible, is there
a different approach/solution to be sure that even the last file will be
correctly moved?
Thank you
Regards
Davide

Reply via email to