[
https://issues.apache.org/jira/browse/CAMEL-10505?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-10505:
--------------------------------
Fix Version/s: 2.19.0
2.18.1
2.17.4
> "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)