Author: ningjiang Date: Mon Jun 7 10:37:16 2010 New Revision: 952183 URL: http://svn.apache.org/viewvc?rev=952183&view=rev Log: CAMEL-2795 ProducerCache send() should use the UnitOfWork to wrap the exchange
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java camel/trunk/camel-core/src/test/java/org/apache/camel/builder/NotifyBuilderTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java?rev=952183&r1=952182&r2=952183&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java Mon Jun 7 10:37:16 2010 @@ -28,6 +28,7 @@ import org.apache.camel.Producer; import org.apache.camel.ProducerCallback; import org.apache.camel.ServicePoolAware; import org.apache.camel.spi.ServicePool; +import org.apache.camel.spi.UnitOfWork; import org.apache.camel.util.CamelContextHelper; import org.apache.camel.util.EventHelper; import org.apache.camel.util.LRUCache; @@ -225,11 +226,21 @@ public class ProducerCache extends Servi if (exchange == null) { exchange = pattern != null ? producer.createExchange(pattern) : producer.createExchange(); } - + if (processor != null) { // lets populate using the processor callback processor.process(exchange); } + + // create the unit of work + DefaultUnitOfWork uow = new DefaultUnitOfWork(exchange); + try { + uow.start(); + } catch (Exception e) { + throw wrapRuntimeCamelException(e); + } + exchange.setUnitOfWork(uow); + // now lets dispatch if (LOG.isDebugEnabled()) { @@ -243,10 +254,20 @@ public class ProducerCache extends Servi StopWatch watch = new StopWatch(); try { producer.process(exchange); - } finally { + } finally { // emit event that the exchange was sent to the endpoint long timeTaken = watch.stop(); EventHelper.notifyExchangeSent(exchange.getContext(), exchange, endpoint, timeTaken); + if (exchange.getUnitOfWork() != null) { + exchange.getUnitOfWork().done(exchange); + } + try { + uow.stop(); + } catch (Exception e) { + LOG.warn("Exception occurred during stopping UnitOfWork for Exchange: " + exchange + + ". This exception will be ignored."); + } + exchange.setUnitOfWork(null); } return exchange; } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/NotifyBuilderTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/NotifyBuilderTest.java?rev=952183&r1=952182&r2=952183&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/builder/NotifyBuilderTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/builder/NotifyBuilderTest.java Mon Jun 7 10:37:16 2010 @@ -334,14 +334,17 @@ public class NotifyBuilderTest extends C } public void testWhenExchangeDoneWithDelay() throws Exception { + // There are two done event, one for the exchange which is created by DefaultProducerTemplate + // the other is for the exchange which is created by route context NotifyBuilder notify = new NotifyBuilder(context) - .whenDone(1) + .whenDone(2) .create(); long start = System.currentTimeMillis(); template.sendBody("seda:cheese", "Hello Cheese"); long end = System.currentTimeMillis(); assertTrue("Should be faster than: " + (end - start), (end - start) < 2000); + assertEquals(false, notify.matches()); @@ -353,8 +356,10 @@ public class NotifyBuilderTest extends C } public void testWhenExchangeDoneAndTimeoutWithDelay() throws Exception { + // There are two done event, one for the exchange which is created by DefaultProducerTemplate + // the other is for the exchange which is created by route context NotifyBuilder notify = new NotifyBuilder(context) - .whenDone(1) + .whenDone(2) .create(); template.sendBody("seda:cheese", "Hello Cheese"); Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java?rev=952183&r1=952182&r2=952183&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java Mon Jun 7 10:37:16 2010 @@ -91,10 +91,9 @@ public class EventNotifierEventsTest ext assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4)); assertIsInstanceOf(ExchangeSentEvent.class, events.get(5)); assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); - assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(7)); - // this is the sent using the produce template to start the test - assertIsInstanceOf(ExchangeSentEvent.class, events.get(8)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(7)); + assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(8)); context.stop(); @@ -119,10 +118,10 @@ public class EventNotifierEventsTest ext assertIsInstanceOf(RouteStartedEvent.class, events.get(1)); assertIsInstanceOf(RouteStartedEvent.class, events.get(2)); assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3)); - assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4)); - assertIsInstanceOf(ExchangeFailureEvent.class, events.get(5)); + assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4)); // this is the sent using the produce template to start the test - assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(5)); + assertIsInstanceOf(ExchangeFailureEvent.class, events.get(6)); context.stop(); Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java?rev=952183&r1=952182&r2=952183&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java Mon Jun 7 10:37:16 2010 @@ -107,8 +107,9 @@ public class EventNotifierFailureHandled assertEquals("mock://dead", send.getDestination().getEndpointUri()); // dead letter channel will mark the exchange as completed - assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(6)); - assertIsInstanceOf(ExchangeSentEvent.class, events.get(7)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); + assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(7)); + } public void testExchangeOnException() throws Exception { @@ -137,8 +138,8 @@ public class EventNotifierFailureHandled assertEquals("should NOT be DLC", false, e.isDeadLetterChannel()); // dead letter channel will mark the exchange as completed - assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(6)); - assertIsInstanceOf(ExchangeSentEvent.class, events.get(7)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); + assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(7)); } } \ No newline at end of file Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java?rev=952183&r1=952182&r2=952183&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java Mon Jun 7 10:37:16 2010 @@ -112,16 +112,17 @@ public class MultipleEventNotifierEvents assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3)); assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4)); assertIsInstanceOf(ExchangeSentEvent.class, events.get(5)); - assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); - assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(7)); - assertIsInstanceOf(ExchangeSentEvent.class, events.get(8)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(7)); + assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(8)); assertEquals(5, events2.size()); assertIsInstanceOf(ExchangeCreatedEvent.class, events2.get(0)); assertIsInstanceOf(ExchangeSentEvent.class, events2.get(1)); assertIsInstanceOf(ExchangeSentEvent.class, events2.get(2)); - assertIsInstanceOf(ExchangeCompletedEvent.class, events2.get(3)); - assertIsInstanceOf(ExchangeSentEvent.class, events2.get(4)); + assertIsInstanceOf(ExchangeSentEvent.class, events2.get(3)); + assertIsInstanceOf(ExchangeCompletedEvent.class, events2.get(4)); + context.stop(); @@ -149,15 +150,17 @@ public class MultipleEventNotifierEvents assertIsInstanceOf(RouteStartedEvent.class, events.get(2)); assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3)); assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4)); - assertIsInstanceOf(ExchangeFailureEvent.class, events.get(5)); - assertIsInstanceOf(ExchangeSentEvent.class, events.get(6)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(5)); + assertIsInstanceOf(ExchangeFailureEvent.class, events.get(6)); + assertEquals(3, events2.size()); context.stop(); assertIsInstanceOf(ExchangeCreatedEvent.class, events2.get(0)); - assertIsInstanceOf(ExchangeFailureEvent.class, events2.get(1)); - assertIsInstanceOf(ExchangeSentEvent.class, events2.get(2)); + assertIsInstanceOf(ExchangeSentEvent.class, events2.get(1)); + assertIsInstanceOf(ExchangeFailureEvent.class, events2.get(2)); + assertEquals(11, events.size()); assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(7));