Author: davsclaus Date: Sat Feb 28 16:26:00 2009 New Revision: 748883 URL: http://svn.apache.org/viewvc?rev=748883&view=rev Log: Better handling of interrupt while sleeping/loopingwhile consuming to better support shutdown.
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameAbsolutePathStrategyTest.java - copied, changed from r748781, camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameStrategyTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveringWhileShutdownTest.java - copied, changed from r748781, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/ServiceStatus.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileRenameExclusiveReadLockStrategy.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteMEPOptionalOutTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/ServiceStatus.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/ServiceStatus.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/ServiceStatus.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/ServiceStatus.java Sat Feb 28 16:26:00 2009 @@ -1,5 +1,4 @@ /** - * * 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. @@ -7,7 +6,7 @@ * (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 + * 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, Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java Sat Feb 28 16:26:00 2009 @@ -94,7 +94,8 @@ if (total > 0 && log.isDebugEnabled()) { log.debug("Total " + total + " files to consume"); } - for (int index = 0; index < total; index++) { + for (int index = 0; index < total && isRunAllowed(); index++) { + // only loop if we are started (allowed to run) GenericFileExchange<T> exchange = exchanges.get(index); // add current index and total as headers exchange.getIn().setHeader(Exchange.FILE_BATCH_INDEX, index); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java Sat Feb 28 16:26:00 2009 @@ -84,7 +84,11 @@ exclusive = true; } else { - sleep(); + boolean interrupted = sleep(); + if (interrupted) { + // we were interrputed while sleeping, we are likely being shutdown so return false + return false; + } } } } catch (IOException e) { @@ -97,7 +101,11 @@ if (LOG.isDebugEnabled()) { LOG.debug("Cannot acquire read lock. Will try again.", e); } - sleep(); + boolean interrupted = sleep(); + if (interrupted) { + // we were interrputed while sleeping, we are likely being shutdown so return false + return false; + } } return true; @@ -122,12 +130,14 @@ } } - private void sleep() { + private boolean sleep() { LOG.trace("Exclusive read lock not granted. Sleeping for 1000 millis."); try { Thread.sleep(1000); + return true; } catch (InterruptedException e) { - // ignore + LOG.debug("Sleep interrupted while waiting for exclusive read lock"); + return false; } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileRenameExclusiveReadLockStrategy.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileRenameExclusiveReadLockStrategy.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileRenameExclusiveReadLockStrategy.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/strategy/GenericFileRenameExclusiveReadLockStrategy.java Sat Feb 28 16:26:00 2009 @@ -68,7 +68,11 @@ // rename it back so we can read it operations.renameFile(newFile.getAbsoluteFileName(), file.getAbsoluteFileName()); } else { - sleep(); + boolean interrupted = sleep(); + if (interrupted) { + // we were interrputed while sleeping, we are likely being shutdown so return false + return false; + } } } @@ -80,12 +84,14 @@ // noop } - private void sleep() { + private boolean sleep() { LOG.trace("Exclusive read lock not granted. Sleeping for 1000 millis."); try { Thread.sleep(1000); + return true; } catch (InterruptedException e) { - // ignore + LOG.debug("Sleep interrupted while waiting for exclusive read lock"); + return false; } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java Sat Feb 28 16:26:00 2009 @@ -62,9 +62,7 @@ try { exchange = queue.poll(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - if (LOG.isTraceEnabled()) { - LOG.trace("Interupted: " + e, e); - } + LOG.debug("Sleep interrupted, are we stopping? " + (isStopping() || isStopped())); continue; } if (exchange != null) { @@ -82,9 +80,7 @@ try { queue.put(exchange); } catch (InterruptedException e) { - if (LOG.isTraceEnabled()) { - LOG.trace("Interupted: " + e, e); - } + LOG.debug("Sleep interrupted, are we stopping? " + (isStopping() || isStopped())); } } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Sat Feb 28 16:26:00 2009 @@ -38,8 +38,8 @@ import org.apache.camel.Routes; import org.apache.camel.RuntimeCamelException; import org.apache.camel.Service; -import org.apache.camel.TypeConverter; import org.apache.camel.ServiceStatus; +import org.apache.camel.TypeConverter; import org.apache.camel.builder.ErrorHandlerBuilder; import org.apache.camel.impl.converter.DefaultTypeConverter; import org.apache.camel.management.InstrumentationLifecycleStrategy; Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java Sat Feb 28 16:26:00 2009 @@ -26,10 +26,9 @@ import org.apache.camel.ExchangeProperty; import org.apache.camel.Message; import org.apache.camel.RuntimeCamelException; -import org.apache.camel.TypeConverter; import org.apache.camel.spi.UnitOfWork; -import org.apache.camel.util.UuidGenerator; import org.apache.camel.util.ExchangeHelper; +import org.apache.camel.util.UuidGenerator; import static org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException; /** Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java Sat Feb 28 16:26:00 2009 @@ -94,8 +94,7 @@ ServiceStatus status = getStatus(); if (status == null) { return true; - } - else { + } else { return status.isStartable(); } } @@ -104,8 +103,7 @@ ServiceStatus status = getStatus(); if (status == null) { return false; - } - else { + } else { return status.isStoppable(); } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java Sat Feb 28 16:26:00 2009 @@ -137,6 +137,9 @@ while (true) { // we can't keep retrying if the route is being shutdown. if (!isRunAllowed()) { + if (LOG.isDebugEnabled()) { + LOG.debug("Rejected execution as we are not started for exchange: " + exchange); + } if (exchange.getException() == null) { exchange.setException(new RejectedExecutionException()); } @@ -175,7 +178,13 @@ MessageHelper.resetStreamCache(exchange.getIn()); // wait until we should redeliver - data.redeliveryDelay = data.currentRedeliveryPolicy.sleep(data.redeliveryDelay, data.redeliveryCounter); + try { + data.redeliveryDelay = data.currentRedeliveryPolicy.sleep(data.redeliveryDelay, data.redeliveryCounter); + } catch (InterruptedException e) { + LOG.debug("Sleep interrupted, are we stopping? " + (isStopping() || isStopped())); + // continue from top + continue; + } // letting onRedeliver be executed deliverToRedeliveryProcessor(exchange, callback, data); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java Sat Feb 28 16:26:00 2009 @@ -138,21 +138,16 @@ * @param redeliveryDelay previous redelivery delay * @param redeliveryCounter number of previous redelivery attempts * @return the calculate delay + * @throws InterruptedException is thrown if the sleep is interruped likely because of shutdown */ - public long sleep(long redeliveryDelay, int redeliveryCounter) { + public long sleep(long redeliveryDelay, int redeliveryCounter) throws InterruptedException { redeliveryDelay = calculateRedeliveryDelay(redeliveryDelay, redeliveryCounter); if (redeliveryDelay > 0) { if (LOG.isDebugEnabled()) { LOG.debug("Sleeping for: " + redeliveryDelay + " millis until attempting redelivery"); } - try { - Thread.sleep(redeliveryDelay); - } catch (InterruptedException e) { - if (LOG.isTraceEnabled()) { - LOG.trace("Thread interrupted: " + e, e); - } - } + Thread.sleep(redeliveryDelay); } return redeliveryDelay; } @@ -202,8 +197,6 @@ for (String group : groups) { long delay = Long.valueOf(ObjectHelper.after(group, ":")); int count = Integer.valueOf(ObjectHelper.before(group, ":")); - - if (count > redeliveryCounter) { break; } else { Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java Sat Feb 28 16:26:00 2009 @@ -19,6 +19,7 @@ import java.util.HashMap; import java.util.Map; +import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; @@ -30,7 +31,6 @@ import org.apache.camel.NoSuchHeaderException; import org.apache.camel.NoSuchPropertyException; import org.apache.camel.NoTypeConversionAvailableException; -import org.apache.camel.CamelContext; import org.apache.camel.TypeConverter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameAbsolutePathStrategyTest.java (from r748781, camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameStrategyTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameAbsolutePathStrategyTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameAbsolutePathStrategyTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameStrategyTest.java&r1=748781&r2=748883&rev=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameStrategyTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerCommitRenameAbsolutePathStrategyTest.java Sat Feb 28 16:26:00 2009 @@ -17,27 +17,33 @@ package org.apache.camel.component.file; import java.io.File; -import java.io.FileWriter; import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.converter.IOConverter; /** - * Unit test for the FileRenameStrategy using move options + * Unit test for the FileRenameStrategy using move options with absolute paths */ -public class FileConsumerCommitRenameStrategyTest extends ContextTestSupport { +public class FileConsumerCommitRenameAbsolutePathStrategyTest extends ContextTestSupport { + + private String base; @Override protected void setUp() throws Exception { deleteDirectory("target/done"); deleteDirectory("target/reports"); + // use current dir as base as aboslute path + base = new File(".").getPath(); super.setUp(); } - public void testRenameSuccess() throws Exception { + // TODO: + public void TestRenameSuccess() throws Exception { + } + + public void xxxTestRenameSuccess() throws Exception { MockEndpoint mock = getMockEndpoint("mock:report"); mock.expectedBodiesReceived("Hello Paris"); mock.expectedFileExists("./target/done/paris.txt", "Hello Paris"); @@ -47,38 +53,11 @@ mock.assertIsSatisfied(); } - public void testRenameFileExists() throws Exception { - // create a file in done to let there be a duplicate file - File file = new File("target/done"); - file.mkdirs(); - FileWriter fw = new FileWriter("./target/done/london.txt"); - try { - fw.write("I was there once in London"); - fw.flush(); - } finally { - fw.close(); - } - - MockEndpoint mock = getMockEndpoint("mock:report"); - mock.expectedBodiesReceived("Hello London"); - - template.sendBodyAndHeader("file:target/reports", "Hello London", Exchange.FILE_NAME, "london.txt"); - - mock.assertIsSatisfied(); - - // sleep to let the file consumer do its renaming - Thread.sleep(100); - - // content of file should be Hello London - String content = IOConverter.toString(new File("./target/done/london.txt")); - assertEquals("The file should have been renamed replacing any existing files", "Hello London", content); - } - protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { public void configure() throws Exception { - from("file://target/reports?moveExpression=../done/${file:name}&consumer.delay=5000").to("mock:report"); + from("file://target/reports?moveExpression=" + base + "/done/${file:name}&consumer.delay=5000").to("mock:report"); } }; } -} +} \ No newline at end of file Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java Sat Feb 28 16:26:00 2009 @@ -38,7 +38,7 @@ assertMockEndpointsSatisfied(); } - public void xxxtestOnExceptionAlterMessageWithHeadersBeforeRedelivery() throws Exception { + public void testOnExceptionAlterMessageWithHeadersBeforeRedelivery() throws Exception { MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedBodiesReceived("Hello World123"); mock.expectedHeaderReceived("foo", "123"); Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveringWhileShutdownTest.java (from r748781, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveringWhileShutdownTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveringWhileShutdownTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java&r1=748781&r2=748883&rev=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelOnRedeliveryTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveringWhileShutdownTest.java Sat Feb 28 16:26:00 2009 @@ -23,35 +23,24 @@ import org.apache.camel.component.mock.MockEndpoint; /** - * Unit test for testing possibility to modify exchange before redelivering + * Unit test for shutting down whil DLC is sleeping in a redelivery. */ -public class DeadLetterChannelOnRedeliveryTest extends ContextTestSupport { +public class DeadLetterChannelRedeliveringWhileShutdownTest extends ContextTestSupport { - static int counter; + public void testDLCRedelivery() throws Exception { + long start = System.currentTimeMillis(); - public void testOnExceptionAlterMessageBeforeRedelivery() throws Exception { MockEndpoint mock = getMockEndpoint("mock:result"); - mock.expectedBodiesReceived("Hello World123"); + mock.expectedBodiesReceived("Hello World"); + // send a message that causes redeliveries + template.sendBody("seda:damm", "Damm World"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); - } - - public void xxxtestOnExceptionAlterMessageWithHeadersBeforeRedelivery() throws Exception { - MockEndpoint mock = getMockEndpoint("mock:result"); - mock.expectedBodiesReceived("Hello World123"); - mock.expectedHeaderReceived("foo", "123"); - - template.sendBodyAndHeader("direct:start", "Hello World", "foo", "123"); - - assertMockEndpointsSatisfied(); - } - @Override - protected void setUp() throws Exception { - super.setUp(); - counter = 0; + long delta = System.currentTimeMillis() - start; + assertTrue("Should be faster than: " + delta, delta < 2500); } @Override @@ -59,47 +48,16 @@ return new RouteBuilder() { @Override public void configure() throws Exception { - // START SNIPPET: e1 - // we configure our Dead Letter Channel to invoke - // MyRedeliveryProcessor before a redelivery is - // attempted. This allows us to alter the message before - errorHandler(deadLetterChannel("mock:error") - .onRedelivery(new MyRedeliverPrcessor()) - // setting delay to zero is just to make unit teting faster - .delay(0L)); - // END SNIPPET: e1 + errorHandler(deadLetterChannel("mock:error").maximumRedeliveries(2).delay(5000)); + from("direct:start").delay(500).to("mock:result"); - from("direct:start").process(new Processor() { + from("seda:damm").process(new Processor() { public void process(Exchange exchange) throws Exception { - // force some error so Camel will do redelivery - if (++counter <= 3) { - throw new IllegalArgumentException("Forced by unit test"); - } + throw new IllegalArgumentException("Damm"); } - }).to("mock:result"); - + }); } }; } - - // START SNIPPET: e2 - // This is our processor that is executed before every redelivery attempt - // here we can do what we want in the java code, such as altering the message - public class MyRedeliverPrcessor implements Processor { - - public void process(Exchange exchange) throws Exception { - // the message is being redelivered so we can alter it - - // we just append the redelivery counter to the body - // you can of course do all kind of stuff instead - String body = exchange.getIn().getBody(String.class); - int count = exchange.getIn().getHeader("CamelRedeliveryCounter", Integer.class); - - exchange.getIn().setBody(body + count); - } - } - // END SNIPPET: e2 - - } \ No newline at end of file Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteMEPOptionalOutTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteMEPOptionalOutTest.java?rev=748883&r1=748882&r2=748883&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteMEPOptionalOutTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteMEPOptionalOutTest.java Sat Feb 28 16:26:00 2009 @@ -17,9 +17,9 @@ package org.apache.camel.processor; import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; import org.apache.camel.Processor; -import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; /**