Andrey Poltavtsev created CAMEL-10505:
-----------------------------------------
Summary: "FILE" component with option "readLock=rename" throws
FileNotFound exception in case of 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)