The built in FileLockExclusiveReadLockStrategy for camel errors on every
message commit:

WARN - MarkerIgnoringBase.warn(136) | Error during commit.
Exchange[test2.txt]. Caused by: [java.nio.channels.ClosedChannelException -
null]
java.nio.channels.ClosedChannelException
        at sun.nio.ch.FileLockImpl.release(FileLockImpl.java:58)
        at
org.apache.camel.component.file.strategy.FileLockExclusiveReadLockStrategy.releaseExclusiveReadLock(FileLockStrategy.java:137)
        at
org.apache.camel.component.file.strategy.GenericFileProcessStrategySupport.commit(GenericFileProcessStrategySupport.java:75)
        at
org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy.commit(GenericFileRenameProcessStrategy.java:92)
        at
org.apache.camel.component.file.GenericFileOnCompletion.processStrategyCommit(GenericFileOnCompletion.java:124)
        at
org.apache.camel.component.file.GenericFileOnCompletion.onCompletion(GenericFileOnCompletion.java:80)
        at
org.apache.camel.component.file.GenericFileOnCompletion.onComplete(GenericFileOnCompletion.java:54)
        at
org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations(UnitOfWorkHelper.java:104)
        at 
org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWork.java:229)
        at 
org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:65)
        at
org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:642)
        at
org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:610)
        at
org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:240)
        at
org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:251)
        at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:447)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:433)
        at
org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)
        at
org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)
        at
org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187)
        at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)


I spent a fair amount of time looking at this and basically the lock is
getting created and released immediately at lines 120,121 where the lock is
aquired.

This means that the release is not only pointless it generates errors
because the channel is closed already and the lock has been released.

I thought that an easy fix would be to simply not close the channel in the
finally clause of acquireExclusiveReadLock method, so that it could be
closed properly in the releaseExclusiveReadLock method. However when I try
and do this it breaks the rename strategy because for some reason the rename
strategy thinks it can rename a file that is locked and tries to release the
lock after trying to rename the file.

Error:
WARN - MarkerIgnoringBase.warn(136) | Error during commit.
Exchange[test2.txt]. Caused by:
[org.apache.camel.component.file.GenericFileOperationFailedException - Error
renaming file from
C:\source\workspace\3.3-BoiseU3\integrations\camel\test-output\filedrop\test2.txt
to test-output\filedrop\.done\test2.txt]
org.apache.camel.component.file.GenericFileOperationFailedException: Error
renaming file from
C:\source\workspace\3.3-BoiseU3\integrations\camel\test-output\filedrop\test2.txt
to test-output\filedrop\.done\test2.txt
        at
org.apache.camel.component.file.FileOperations.renameFile(FileOperations.java:77)
        at
org.apache.camel.component.file.strategy.GenericFileProcessStrategySupport.renameFile(GenericFileProcessStrategySupport.java:113)
        at
org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy.commit(GenericFileRenameProcessStrategy.java:88)
        at
org.apache.camel.component.file.GenericFileOnCompletion.processStrategyCommit(GenericFileOnCompletion.java:124)
        at
org.apache.camel.component.file.GenericFileOnCompletion.onCompletion(GenericFileOnCompletion.java:80)
        at
org.apache.camel.component.file.GenericFileOnCompletion.onComplete(GenericFileOnCompletion.java:54)
        at
org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations(UnitOfWorkHelper.java:104)
        at 
org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWork.java:229)
        at 
org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:65)
        at
org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:642)
        at
org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:610)
        at
org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:240)
        at
org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:251)
        at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:447)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:433)
        at
org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)
        at
org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)
        at
org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187)
        at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Renaming file from
'C:\source\workspace\3.3-BoiseU3\integrations\camel\test-output\filedrop\test2.txt'
to 'test-output\filedrop\.done\test2.txt' failed: Cannot delete file
'C:\source\workspace\3.3-BoiseU3\integrations\camel\test-output\filedrop\test2.txt'
after copy succeeded
        at org.apache.camel.util.FileUtil.renameFileUsingCopy(FileUtil.java:471)
        at org.apache.camel.util.FileUtil.renameFile(FileUtil.java:443)
        at
org.apache.camel.component.file.FileOperations.renameFile(FileOperations.java:74)

here is the method in GenericFileRenameProcessStrategy:
    @Override
    public void commit(GenericFileOperations<T> operations,
GenericFileEndpoint<T> endpoint, Exchange exchange, GenericFile<T> file)
throws Exception {
        try {
            if (commitRenamer != null) {
                // create a copy and bind the file to the exchange to be
used by the renamer to evaluate the file name
                Exchange copy = exchange.copy();
                file.bindToExchange(copy);
                // must preserve message id
                copy.getIn().setMessageId(exchange.getIn().getMessageId());
                copy.setExchangeId(exchange.getExchangeId());

                GenericFile<T> newName = commitRenamer.renameFile(copy,
file);
                renameFile(operations, file, newName);
            }
        } finally {
            // must invoke super
            super.commit(operations, endpoint, exchange, file);
        }
    }

super.commit is what does the lock release, unfortunately you have to
release the lock before deleting the file.

There is no easy fix for this (short of ripping open the jar and replacing
the code ) because this rename strategy doesn't appear to be pluggable
piece.

I can fix/avoid the issue by simply not releasing the lock during release
and avoiding the error with my own version of the filelock strategy, but
what's the point of creating a locking strategy that doesn't bother to keep
its lock?

I assume this has to be a bug. Any advice would be helpful.

Any advice here would be helpful






--
View this message in context: 
http://camel.465427.n5.nabble.com/FileLockExclusiveReadLockStrategy-doesn-t-hold-lock-and-error-on-commit-tp5762668.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to