Author: davsclaus Date: Fri Sep 11 10:58:10 2009 New Revision: 813776 URL: http://svn.apache.org/viewvc?rev=813776&view=rev Log: CAMEL-1679: Added InflightRepository with a very basic implementation that can help with graceful shutdown to avoid shutting down if there are in progress exchanges.
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java (with props) camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java (with props) Modified: camel/trunk/camel-core/ (props changed) camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.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/DefaultUnitOfWork.java camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Propchange: camel/trunk/camel-core/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Fri Sep 11 10:58:10 2009 @@ -6,3 +6,4 @@ .settings eclipse-classes *.i?? +classes Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=813776&r1=813775&r2=813776&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Fri Sep 11 10:58:10 2009 @@ -28,6 +28,7 @@ import org.apache.camel.spi.EndpointStrategy; import org.apache.camel.spi.FactoryFinder; import org.apache.camel.spi.FactoryFinderResolver; +import org.apache.camel.spi.InflightRepository; import org.apache.camel.spi.Injector; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.Language; @@ -552,4 +553,8 @@ */ void disableJMX(); + InflightRepository getInflightRepository(); + + void setInflightRepository(InflightRepository repository); + } 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=813776&r1=813775&r2=813776&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 Fri Sep 11 10:58:10 2009 @@ -63,6 +63,7 @@ import org.apache.camel.spi.EndpointStrategy; import org.apache.camel.spi.FactoryFinder; import org.apache.camel.spi.FactoryFinderResolver; +import org.apache.camel.spi.InflightRepository; import org.apache.camel.spi.Injector; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.Language; @@ -133,6 +134,7 @@ private ServicePool<Endpoint, Producer> producerServicePool = new DefaultProducerServicePool(100); private NodeIdFactory nodeIdFactory = new DefaultNodeIdFactory(); private Tracer defaultTracer; + private InflightRepository inflightRepository = new DefaultInflightRepository(); public DefaultCamelContext() { super(); @@ -1206,6 +1208,14 @@ disableJMX = true; } + public InflightRepository getInflightRepository() { + return inflightRepository; + } + + public void setInflightRepository(InflightRepository repository) { + this.inflightRepository = repository; + } + protected String getEndpointKey(String uri, Endpoint endpoint) { if (endpoint.isSingleton()) { return uri; Added: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java?rev=813776&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java Fri Sep 11 10:58:10 2009 @@ -0,0 +1,44 @@ +/** + * 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.impl; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.camel.Exchange; +import org.apache.camel.spi.InflightRepository; + +/** + * Default implement which just uses a counter + * + * @version $Revision$ + */ +public class DefaultInflightRepository implements InflightRepository { + + private final AtomicInteger count = new AtomicInteger(); + + public void add(Exchange exchange) { + count.incrementAndGet(); + } + + public void remove(Exchange exchange) { + count.decrementAndGet(); + } + + public int size() { + return count.get(); + } +} Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultInflightRepository.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java?rev=813776&r1=813775&r2=813776&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java Fri Sep 11 10:58:10 2009 @@ -64,6 +64,11 @@ // fire event EventHelper.notifyExchangeCreated(exchange.getContext(), exchange); + + // register to inflight registry + if (exchange.getContext() != null) { + exchange.getContext().getInflightRepository().add(exchange); + } } public void start() throws Exception { @@ -133,6 +138,12 @@ } } } + + // unregister from inflight registry + if (exchange.getContext() != null) { + exchange.getContext().getInflightRepository().remove(exchange); + } + } public String getId() { Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java?rev=813776&r1=813775&r2=813776&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java Fri Sep 11 10:58:10 2009 @@ -76,6 +76,11 @@ context.setTracing(tracing); } + @ManagedAttribute(description = "Current number of inflight Exchanges") + public Integer getInflightExchanges() { + return context.getInflightRepository().size(); + } + @ManagedOperation(description = "Start Camel") public void start() throws Exception { context.start(); Added: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java?rev=813776&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java Fri Sep 11 10:58:10 2009 @@ -0,0 +1,49 @@ +/** + * 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.spi; + +import org.apache.camel.Exchange; + +/** + * @version $Revision$ + */ +public interface InflightRepository { + + /** + * Adds the exchange to the inflight registry + * + * @param exchange the exchange + */ + void add(Exchange exchange); + + /** + * Removes the exchange from the inflight registry + * + * @param exchange the exchange + */ + void remove(Exchange exchange); + + /** + * Current size of inflight exchanges. + * <p/> + * Will return 0 if there are no inflight exchanges. + * + * @return number of exchanges currently in flight. + */ + int size(); + +} Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InflightRepository.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java?rev=813776&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java Fri Sep 11 10:58:10 2009 @@ -0,0 +1,47 @@ +/** + * 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.impl; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.spi.InflightRepository; + +/** + * @version $Revision$ + */ +public class DefaultInflightRepositoryTest extends ContextTestSupport { + + public void testDefaultInflightRepository() throws Exception { + InflightRepository repo = new DefaultInflightRepository(); + + assertEquals(0, repo.size()); + + Exchange e1 = new DefaultExchange(context); + repo.add(e1); + assertEquals(1, repo.size()); + + Exchange e2 = new DefaultExchange(context); + repo.add(e2); + assertEquals(2, repo.size()); + + repo.remove(e2); + assertEquals(1, repo.size()); + + repo.remove(e1); + assertEquals(0, repo.size()); + } +} Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultInflightRepositoryTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java?rev=813776&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java Fri Sep 11 10:58:10 2009 @@ -0,0 +1,62 @@ +/** + * 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.impl; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; + +/** + * @version $Revision$ + */ +public class InflightRepositoryRouteTest extends ContextTestSupport { + + private final CountDownLatch latch = new CountDownLatch(1); + + public void testInflight() throws Exception { + assertEquals(0, context.getInflightRepository().size()); + + template.asyncSendBody("direct:start", "Hello World"); + latch.await(5, TimeUnit.SECONDS); + + assertEquals(1, context.getInflightRepository().size()); + + // wait to be sure its done + Thread.sleep(2000); + + assertEquals(0, context.getInflightRepository().size()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + latch.countDown(); + } + }).delay(1000).to("mock:result"); + } + }; + } +} Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/InflightRepositoryRouteTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=813776&r1=813775&r2=813776&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original) +++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Fri Sep 11 10:58:10 2009 @@ -62,6 +62,7 @@ import org.apache.camel.spi.EventFactory; import org.apache.camel.spi.EventNotifier; import org.apache.camel.spi.FactoryFinderResolver; +import org.apache.camel.spi.InflightRepository; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.LifecycleStrategy; import org.apache.camel.spi.ManagementStrategy; @@ -234,6 +235,12 @@ getContext().addInterceptStrategy(delayer); } + InflightRepository inflightRepository = getBeanForType(InflightRepository.class); + if (delayer != null) { + LOG.info("Using custom InflightRepository: " + inflightRepository); + getContext().setInflightRepository(inflightRepository); + } + ManagementStrategy managementStrategy = getBeanForType(ManagementStrategy.class); if (managementStrategy != null) { LOG.info("Using custom ManagementStrategy: " + managementStrategy);