You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2016/11/22 08:39:58 UTC

[jira] [Commented] (CAMEL-10505) "FILE" component with option "readLock=rename" throws FileNotFound exception in case of work file is locked/used by another application

    [ https://issues.apache.org/jira/browse/CAMEL-10505?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15686081#comment-15686081 ] 

Claus Ibsen commented on CAMEL-10505:
-------------------------------------

Can you do a PR or patch file for this?
http://camel.apache.org/contributing

PR on github is often the easiest. You can do this on the master branch and we will merge to older branches.

> "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
>             Fix For: 2.17.4, 2.18.1, 2.19.0
>
>
> 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)