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



Reply via email to