Good suggestion, I will update the header with this name. Thanks,
-- Willem Jiang Red Hat, Inc. FuseSource is now part of Red Hat Web: http://www.fusesource.com | http://www.redhat.com Blog: http://willemjiang.blogspot.com (http://willemjiang.blogspot.com/) (English) http://jnn.javaeye.com (http://jnn.javaeye.com/) (Chinese) Twitter: willemjiang Weibo: willemjiang On Thursday, November 8, 2012 at 4:30 PM, Claus Ibsen wrote: > I suggest to use FILE_LOCK_ACQUIRED as a better english term. > > > > On Thu, Nov 8, 2012 at 9:22 AM, <ningji...@apache.org > (mailto:ningji...@apache.org)> wrote: > > Author: ningjiang > > Date: Thu Nov 8 08:22:38 2012 > > New Revision: 1406948 > > > > URL: http://svn.apache.org/viewvc?rev=1406948&view=rev > > Log: > > CAMEL-5776 Fixed the issue that .camelLock is deleted by another camel > > instance > > > > Added: > > camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyReadLockFailedTest.java > > Modified: > > camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java > > camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java > > > > Modified: > > camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java > > URL: > > http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?rev=1406948&r1=1406947&r2=1406948&view=diff > > ============================================================================== > > --- camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java > > (original) > > +++ camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Thu > > Nov 8 08:22:38 2012 > > @@ -120,6 +120,7 @@ public interface Exchange { > > String FILE_PARENT = "CamelFileParent"; > > String FILE_LAST_MODIFIED = "CamelFileLastModified"; > > String FILTER_MATCHED = "CamelFilterMatched"; > > + String FILE_LOCK_FILE_GOT = "CamelFileLockFileGot"; > > > > String GROUPED_EXCHANGE = "CamelGroupedExchange"; > > > > > > Modified: > > camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java > > URL: > > http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java?rev=1406948&r1=1406947&r2=1406948&view=diff > > ============================================================================== > > --- > > camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java > > (original) > > +++ > > camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategy.java > > Thu Nov 8 08:22:38 2012 > > @@ -52,6 +52,7 @@ public class MarkerFileExclusiveReadLock > > // create a plain file as marker filer for locking (do not use FileLock) > > File lock = new File(lockFileName); > > boolean acquired = lock.createNewFile(); > > + exchange.setProperty(Exchange.FILE_LOCK_FILE_GOT, acquired); > > > > return acquired; > > } > > @@ -60,11 +61,14 @@ public class MarkerFileExclusiveReadLock > > GenericFile<File> file, Exchange exchange) throws Exception { > > String lockFileName = getLockFileName(file); > > File lock = new File(lockFileName); > > - > > - LOG.trace("Unlocking file: {}", lockFileName); > > - > > - boolean deleted = FileUtil.deleteFile(lock); > > - LOG.trace("Lock file: {} was deleted: {}", lockFileName, deleted); > > + // only release the file if camel get the lock before > > + if (exchange.getProperty(Exchange.FILE_LOCK_FILE_GOT, false, > > Boolean.class)) { > > + LOG.trace("Unlocking file: {}", lockFileName); > > + boolean deleted = FileUtil.deleteFile(lock); > > + LOG.trace("Lock file: {} was deleted: {}", lockFileName, deleted); > > + } else { > > + LOG.trace("Don't try to delete the Lock file: {} as camel doesn't get to > > lock before.", lockFileName); > > + } > > } > > > > public void setTimeout(long timeout) { > > > > Added: > > camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyReadLockFailedTest.java > > URL: > > http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyReadLockFailedTest.java?rev=1406948&view=auto > > ============================================================================== > > --- > > camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyReadLockFailedTest.java > > (added) > > +++ > > camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/strategy/MarkerFileExclusiveReadLockStrategyReadLockFailedTest.java > > Thu Nov 8 08:22:38 2012 > > @@ -0,0 +1,109 @@ > > +/** > > + * Licensed to the Apache Software Foundation (ASF) under one or more > > + * contributor license agreements. See the NOTICE file distributed with > > + * this work for additional information regarding copyright ownership. > > + * The ASF licenses this file to You under the Apache License, Version 2.0 > > + * (the "License"); you may not use this file except in compliance with > > + * the License. You may obtain a copy of the License at > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > +package org.apache.camel.component.file.strategy; > > + > > +import java.io.File; > > +import java.io.FileOutputStream; > > +import java.util.concurrent.atomic.AtomicInteger; > > + > > +import org.apache.camel.ContextTestSupport; > > +import org.apache.camel.Exchange; > > +import org.apache.camel.Processor; > > +import org.apache.camel.builder.RouteBuilder; > > +import org.apache.camel.component.mock.MockEndpoint; > > +import org.slf4j.Logger; > > +import org.slf4j.LoggerFactory; > > + > > +/** > > + * Tests the MarkerFileExclusiveReadLockStrategy in a multi-threaded > > scenario. > > + */ > > +public class MarkerFileExclusiveReadLockStrategyReadLockFailedTest extends > > ContextTestSupport { > > + > > + private static final transient Logger LOG = > > LoggerFactory.getLogger(MarkerFileExclusiveReadLockStrategyReadLockFailedTest.class); > > + > > + @Override > > + protected void setUp() throws Exception { > > + deleteDirectory("target/readlock/"); > > + createDirectory("target/readlock/in"); > > + super.setUp(); > > + } > > + > > + public void testReadLockFailed() throws Exception { > > + MockEndpoint mock = getMockEndpoint("mock:result"); > > + mock.expectedMessageCount(1); > > + mock.expectedFileExists("target/readlock/out/file1.dat"); > > + > > + writeFiles(); > > + > > + > > + assertMockEndpointsSatisfied(); > > + > > + String content = context.getTypeConverter().convertTo(String.class, new > > File("target/readlock/out/file1.dat").getAbsoluteFile()); > > + String[] lines = content.split(LS); > > + for (int i = 0; i < 20; i++) { > > + assertEquals("Line " + i, lines[i]); > > + } > > + > > + // wait for a while for camel to clean up the file > > + Thread.sleep(500); > > + > > + assertFileDoesNotExists("target/readlock/in/file1.dat.camelLock"); > > + assertFileExists("target/readlock/in/file2.dat.camelLock"); > > + > > + assertFileDoesNotExists("target/readlock/in/file1.dat"); > > + assertFileExists("target/readlock/in/file2.dat"); > > + > > + } > > + > > + private void writeFiles() throws Exception { > > + LOG.debug("Writing files..."); > > + // create a camelLock file first > > + File lock = new File("target/readlock/in/file2.dat.camelLock"); > > + lock.createNewFile(); > > + > > + FileOutputStream fos = new > > FileOutputStream("target/readlock/in/file1.dat"); > > + FileOutputStream fos2 = new > > FileOutputStream("target/readlock/in/file2.dat"); > > + for (int i = 0; i < 20; i++) { > > + fos.write(("Line " + i + LS).getBytes()); > > + fos2.write(("Line " + i + LS).getBytes()); > > + LOG.debug("Writing line " + i); > > + } > > + > > + fos.flush(); > > + fos.close(); > > + fos2.flush(); > > + fos2.close(); > > + } > > + > > + @Override > > + protected RouteBuilder createRouteBuilder() throws Exception { > > + return new RouteBuilder() { > > + @Override > > + public void configure() throws Exception { > > + from("file:target/readlock/in?readLock=markerFile") > > + .to("file:target/readlock/out", "mock:result"); > > + } > > + }; > > + } > > + > > + > > + private static void assertFileDoesNotExists(String filename) { > > + File file = new File(filename).getAbsoluteFile(); > > + assertFalse("File " + filename + " should not exist, it should have been > > deleted after being processed", file.exists()); > > + } > > + > > +} > > > > > > -- > Claus Ibsen > ----------------- > Red Hat, Inc. > FuseSource is now part of Red Hat > Email: cib...@redhat.com (mailto:cib...@redhat.com) > Web: http://fusesource.com > Twitter: davsclaus > Blog: http://davsclaus.com > Author of Camel in Action: http://www.manning.com/ibsen