[ 
https://issues.apache.org/jira/browse/CAMEL-10505?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrey Poltavtsev updated CAMEL-10505:
--------------------------------------
    Summary: "FILE" component with option "readLock=rename" throws FileNotFound 
exception in case of work file is locked/used by another application  (was: 
"FILE" component with option "readLock=rename" throws FileNotFound exception in 
case of file is locked/used by another application)

> "FILE" component with option "readLock=rename" throws FileNotFound exception 
> in case of work file is locked/used by another application
> ---------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-10505
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10505
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.17.3
>         Environment: Windows 7 / Java 8.
>            Reporter: Andrey Poltavtsev
>
> Option "readLock=rename" (according to htttp://camel.apache.org/file2.html) 
> is necessary to lock work file in case of it is not used by another 
> application. But currently we see "FileNotFound" during test rename operation 
> and "FILE" component tries to lock and process corresponding work file.
> This issue can be resolved by wrapping of corresponding rename operation by 
> try-catch block. See locally corrected code for 
> "camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileRenameExclusiveReadLockStrategy.java"
>     @Override
>     public boolean acquireExclusiveReadLock(GenericFileOperations<T> 
> operations, GenericFile<T> file,
>                                             Exchange exchange) throws 
> Exception {
>         LOG.trace("Waiting for exclusive read lock to file: {}", file);
>         // the trick is to try to rename the file, if we can rename then we 
> have exclusive read
>         // since its a Generic file we cannot use java.nio to get a RW lock
>         String newName = file.getFileName() + ".camelExclusiveReadLock";
>         // make a copy as result and change its file name
>         GenericFile<T> newFile = file.copyFrom(file);
>         newFile.changeFileName(newName);
>         StopWatch watch = new StopWatch();
>         boolean exclusive = false;
>         while (!exclusive) {
>             // timeout check
>             if (timeout > 0) {
>                 long delta = watch.taken();
>                 if (delta > timeout) {
>                     CamelLogger.log(LOG, readLockLoggingLevel,
>                             "Cannot acquire read lock within " + timeout + " 
> millis. Will skip the file: " + file);
>                     // we could not get the lock within the timeout period, 
> so return false
>                     return false;
>                 }
>             }
>             try{
>               exclusive = operations.renameFile(file.getAbsoluteFilePath(), 
> newFile.getAbsoluteFilePath());
>             }catch(GenericFileOperationFailedException ex){
>               if(ex.getCause() !=null && ex.getCause() instanceof 
> FileNotFoundException){
>                       exclusive = false;
>               }else{
>                       throw ex;
>               }
>             }
>             if (exclusive) {
>                 LOG.trace("Acquired exclusive read lock to file: {}", file);
>                 // rename it back so we can read it
>                 operations.renameFile(newFile.getAbsoluteFilePath(), 
> file.getAbsoluteFilePath());
>             } else {
>                 boolean interrupted = sleep();
>                 if (interrupted) {
>                     // we were interrupted while sleeping, we are likely 
> being shutdown so return false
>                     return false;
>                 }
>             }
>         }
>         return true;
>     }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to