[
https://issues.apache.org/jira/browse/CAMEL-10505?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrey Poltavtsev updated CAMEL-10505:
--------------------------------------
Description:
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"
in attachment (diff.txt)
was:
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;
}
> "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
>
> Attachments: diff.txt
>
>
> 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"
> in attachment (diff.txt)
>
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)