Hi

I just spotted bunch of flaws in that utility class and logged a ticket for
it:

https://issues.apache.org/jira/browse/CAMEL-6951

Babak


Claus Ibsen-2 wrote
> Hi
> 
> There is a stopAndShutdownService method on ServiceHelper in the util
> package. Its maybe nicer to use to than the type cast. Then you can do
> that in one command.
> 
> And this is also how we stop/start/shutdown services in a cleaner way.
> And if you enabled TRACE/DEBUG logging the service helper can log what
> happens as well.
> 
> On Fri, Nov 8, 2013 at 9:46 PM,  <

> bvahdat@

> > wrote:
>> Updated Branches:
>>   refs/heads/master f74ff2cf6 -> f744afd9c
>>
>>
>> CAMEL-6948: Releasing a non-singleton producer by ProducerCache should
>> not only stop the producer but also shutdown it as well if it is a
>> ShutdownableService.
>>
>> Project: http://git-wip-us.apache.org/repos/asf/camel/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f744afd9
>> Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f744afd9
>> Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f744afd9
>>
>> Branch: refs/heads/master
>> Commit: f744afd9c39a1fc9261ad68dabe06a51a238fac9
>> Parents: f74ff2c
>> Author: Babak Vahdat <

> bvahdat@

> >
>> Authored: Fri Nov 8 21:45:59 2013 +0100
>> Committer: Babak Vahdat <

> bvahdat@

> >
>> Committed: Fri Nov 8 21:45:59 2013 +0100
>>
>> ----------------------------------------------------------------------
>>  .../org/apache/camel/impl/ProducerCache.java    |  6 +++
>>  .../camel/impl/DefaultProducerCacheTest.java    | 53
>> +++++++++++++++++---
>>  2 files changed, 51 insertions(+), 8 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/camel/blob/f744afd9/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java
>> b/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java
>> index 6b292c0..b35eca5 100644
>> --- a/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java
>> +++ b/camel-core/src/main/java/org/apache/camel/impl/ProducerCache.java
>> @@ -30,6 +30,7 @@ import org.apache.camel.Processor;
>>  import org.apache.camel.Producer;
>>  import org.apache.camel.ProducerCallback;
>>  import org.apache.camel.ServicePoolAware;
>> +import org.apache.camel.ShutdownableService;
>>  import org.apache.camel.processor.UnitOfWorkProducer;
>>  import org.apache.camel.spi.ServicePool;
>>  import org.apache.camel.support.ServiceSupport;
>> @@ -137,6 +138,11 @@ public class ProducerCache extends ServiceSupport {
>>          } else if (!producer.isSingleton()) {
>>              // stop non singleton producers as we should not leak
>> resources
>>              producer.stop();
>> +
>> +            // shutdown as well in case the producer is shutdownable
>> +            if (producer instanceof ShutdownableService) {
>> +                ShutdownableService.class.cast(producer).shutdown();
>> +            }
>>          }
>>      }
>>
>>
>> http://git-wip-us.apache.org/repos/asf/camel/blob/f744afd9/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerCacheTest.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerCacheTest.java
>> b/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerCacheTest.java
>> index 5ad0f42..803302c 100644
>> ---
>> a/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerCacheTest.java
>> +++
>> b/camel-core/src/test/java/org/apache/camel/impl/DefaultProducerCacheTest.java
>> @@ -30,7 +30,8 @@ import org.apache.camel.Producer;
>>   */
>>  public class DefaultProducerCacheTest extends ContextTestSupport {
>>
>> -    private static final AtomicInteger COUNTER = new AtomicInteger();
>> +    private final AtomicInteger stopCounter = new AtomicInteger();
>> +    private final AtomicInteger shutdownCounter = new AtomicInteger();
>>
>>      public void testCacheProducerAcquireAndRelease() throws Exception {
>>          ProducerCache cache = new ProducerCache(this, context);
>> @@ -56,7 +57,7 @@ public class DefaultProducerCacheTest extends
>> ContextTestSupport {
>>          assertEquals("Size should be 0", 0, cache.size());
>>
>>          for (int i = 0; i < 8; i++) {
>> -            Endpoint e = new MyEndpoint(i);
>> +            Endpoint e = new MyEndpoint(true, i);
>>              Producer p = cache.acquireProducer(e);
>>              cache.releaseProducer(e, p);
>>          }
>> @@ -64,19 +65,50 @@ public class DefaultProducerCacheTest extends
>> ContextTestSupport {
>>          assertEquals("Size should be 5", 5, cache.size());
>>
>>          // should have stopped the 3 evicted
>> -        assertEquals(3, COUNTER.get());
>> +        assertEquals(3, stopCounter.get());
>>
>>          cache.stop();
>>
>>          // should have stopped all 8
>> -        assertEquals(8, COUNTER.get());
>> +        assertEquals(8, stopCounter.get());
>> +    }
>> +
>> +    public void
>> testReleaseProducerInvokesStopAndShutdownByNonSingeltonProducers() throws
>> Exception {
>> +        ProducerCache cache = new ProducerCache(this, context, 1);
>> +        cache.start();
>> +
>> +        assertEquals("Size should be 0", 0, cache.size());
>> +
>> +        for (int i = 0; i < 3; i++) {
>> +            Endpoint e = new MyEndpoint(false, i);
>> +            Producer p = cache.acquireProducer(e);
>> +            cache.releaseProducer(e, p);
>> +        }
>> +
>> +        assertEquals("Size should be 0", 0, cache.size());
>> +
>> +        // should have stopped all 3
>> +        assertEquals(3, stopCounter.get());
>> +
>> +        // should have shutdown all 3
>> +        assertEquals(3, shutdownCounter.get());
>> +
>> +        cache.stop();
>> +
>> +        // no more stop after stopping the cache
>> +        assertEquals(3, stopCounter.get());
>> +
>> +        // no more shutdown after stopping the cache
>> +        assertEquals(3, shutdownCounter.get());
>>      }
>>
>>      private final class MyEndpoint extends DefaultEndpoint {
>>
>> -        private int number;
>> +        private final boolean isSingleton;
>> +        private final int number;
>>
>> -        private MyEndpoint(int number) {
>> +        private MyEndpoint(boolean isSingleton, int number) {
>> +            this.isSingleton = isSingleton;
>>              this.number = number;
>>          }
>>
>> @@ -92,7 +124,7 @@ public class DefaultProducerCacheTest extends
>> ContextTestSupport {
>>
>>          @Override
>>          public boolean isSingleton() {
>> -            return true;
>> +            return isSingleton;
>>          }
>>
>>          @Override
>> @@ -114,7 +146,12 @@ public class DefaultProducerCacheTest extends
>> ContextTestSupport {
>>
>>          @Override
>>          protected void doStop() throws Exception {
>> -            COUNTER.incrementAndGet();
>> +            stopCounter.incrementAndGet();
>> +        }
>> +
>> +        @Override
>> +        protected void doShutdown() throws Exception {
>> +            shutdownCounter.incrementAndGet();
>>          }
>>      }
>>
>>
> 
> 
> 
> -- 
> Claus Ibsen
> -----------------
> Red Hat, Inc.
> Email: 

> cibsen@

> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen





--
View this message in context: 
http://camel.465427.n5.nabble.com/Re-git-commit-CAMEL-6948-Releasing-a-non-singleton-producer-by-ProducerCache-should-not-only-stop-th-tp5742926p5742957.html
Sent from the Camel Development mailing list archive at Nabble.com.

Reply via email to