Thanks for the heads up Arjan! I've added the test case to the trunk -
though it seems to work fine for me :(
See DirectoryCreateIssueTest in the camel-core module.
(I tried removing the dependency on Juel and commons-io so that the
test could easily live in the camel-core test library). Maybe I broke
something during this refactor?
On 31/10/2007, Arjan Moraal <[EMAIL PROTECTED]> wrote:
>
> Hi all,
>
> I have a problem with the FileComponent endpoint. In our application, a lot
> of files are written at about the same time to a directory that might not
> exist yet. This often causes a FileNotFoundException. Or the directory is
> created as file instead of directory.
>
> I managed to extract it into a unit test that fails with a
> FileNotFoundException on the directory (See bottom of this message).
>
> I think the problem is in the FileProducer.process() method where it first
> tries to build the filename String, and then creates the parent directories:
> File file = createFileName(exchange.getIn());
> buildDirectory(file);
> However, the createFileName() method already checks whether the directory
> exists (if (endpointFile.isDirectory()), which might not be the case since
> buildDirectory() is called after createFileName()...
>
> I don't have a solution/patch yet, but I thought I just let you know anyway
> :)
>
> Thanks,
> Arjan
>
> package com.bbc.newsi.feeds.sport.renderservice.camel;
>
> import static org.apache.camel.language.juel.JuelExpression.el;
>
> import java.io.File;
>
> import junit.framework.TestCase;
>
> import org.apache.camel.CamelContext;
> import org.apache.camel.CamelTemplate;
> import org.apache.camel.Exchange;
> import org.apache.camel.Message;
> import org.apache.camel.Processor;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.component.file.FileComponent;
> import org.apache.camel.impl.DefaultCamelContext;
> import org.apache.commons.io.FileUtils;
> import org.apache.log4j.BasicConfigurator;
> import org.apache.log4j.Level;
> import org.apache.log4j.Logger;
>
> /**
> *
> * @author Albert Moraal
> * @version $Revision$ $Date$ $Author$
> */
> public class FileAsDirBugTest extends TestCase {
> private static final Logger log =
> Logger.getLogger(FileAsDirBugTest.class);
>
> private CamelContext context;
> private CamelTemplate template;
>
> @Override
> protected void setUp() throws Exception {
> super.setUp();
> BasicConfigurator.configure();
> Logger.getRootLogger().setLevel(Level.DEBUG);
> context = new DefaultCamelContext();
> context.start();
> template = new CamelTemplate(context);
> }
>
> @Override
> protected void tearDown() throws Exception {
> context.stop();
> super.tearDown();
> }
>
> public void testFileCreatedAsDir() throws Exception {
> log.debug("testFileCreatedAsDir");
> final String path = "a/b/c/d/e/f/g/h";
> final int numFiles = 10;
>
> context.addRoutes(
> new RouteBuilder() {
> @Override
> public void configure() {
> String[] destinations = new String[numFiles];
> for (int i=0; i<numFiles; i++) {
> destinations[i] = "seda:file"+i;
>
> from("seda:file"+i)
> .setHeader(FileComponent.HEADER_FILE_NAME,
> el("file"+i+".txt"))
> .to("file://"+path+"/?append=false&noop=true");
> }
>
> from("seda:testFileCreatedAsDir")
> .to(destinations);
> }
> }
> );
>
> FileUtils.deleteDirectory(new File("a"));
>
> template.send("seda:testFileCreatedAsDir", new Processor() {
> public void process(Exchange exchange) {
> Message in = exchange.getIn();
> in.setBody("Contents of test file");
> }
> });
>
> Thread.sleep(2*1000);
> for (int i=0; i<numFiles; i++) {
> assertTrue((new File(path+"/file"+i+".txt")).isFile());
> }
> }
>
> }
>
>
> --
> View this message in context:
> http://www.nabble.com/Problem-with-concurrent-dir-file-access--tf4724448s22882.html#a13507397
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>
--
James
-------
http://macstrac.blogspot.com/
Open Source SOA
http://open.iona.com