6

I have a customer who ftp's a file over to our server. I have a route defined to select certain files from this directory and move them to a different directory to be processed. The problem is that it takes it as soon as it sees it and doesn't wait till the ftp is complete. The result is a 0 byte file in the path described in the to uri. I have tried each of the readLock options (masterFile,rename,changed, fileLock) but none have worked. I am using spring DSL to define my camel routes. Here is an example of one that is not working. camel version is 2.10.0

    <route>
        <from uri="file:pathName?initialDelay=10s&amp;move=ARCHIVE&amp;sortBy=ignoreCase:file:name&amp;readLock=fileLock&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;filter=#FileFilter" />
        <to uri="file:pathName/newDirectory/" />
    </route>

Any help would be appreciated. Thanks!

Just to note...At one point this route was running on a different server and I had to ftp the file to another server that processed it. When I was using the ftp component in camel, that route worked fine. That is it did wait till the file was received before doing the ftp. I had the same option on my route defined. Thats why I am thinking there should be a way to do it since the ftp component uses the file component options in camel.


I am taking @PeteH's suggestion #2 and did the following. I am still hoping there is another way, but this will work.

I added the following method that returns me a Date that is current.minus(x seconds)

public static Date getDateMinusSeconds(Integer seconds) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, seconds);
return  cal.getTime();
}

Then within my filter I check if the initial filtering is true. If it is I compare the Last modified date to the getDateMinusSeconds(). I return a false for the filter if the comparison is true.

    if(filter){
        if(new Date(pathname.getLastModified()).after(DateUtil.getDateMinusSeconds(-30))){
            return false;
        }
    } 
4

3 に答える 3

5

私はあなたの環境でこれを行ったことはありませんが、以前に FTP でこの種の問題が発生したことがあります。

私が提案できる 2 つのオプションのうち、より良いオプションは、顧客に 2 つのファイルを送信してもらうことです。File1 はデータであり、File2 は何でもかまいません。彼らはそれらを順次送信します。File2 が到着したときにトラップしますが、File1 が無事に到着したという「信号」として使用しているだけです。

あまり良くないオプション (これは、送信されるファイルを制御できなかったために最終的に実装することになったオプションです) は、最後に変更されたタイムスタンプが少なくともx分前になるまでファイルの処理を拒否するようにコードを記述することです。5分で落ち着いたと思います。基本的に発砲、チェック、スリープ、チェックなどを行っているため、これはかなり恐ろしいことです。

しかし、あなたが説明した問題は、FTP ではよく知られています。私が言うように、これらのアプローチのいずれかがあなたの環境で機能するかどうかはわかりませんが、確かに高いレベルでは健全です。

于 2012-12-12T17:13:46.170 に答える