CAMEL-8030 Release the thread pool when shutting down the netty endpoint
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d1c06a45 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d1c06a45 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d1c06a45 Branch: refs/heads/master Commit: d1c06a458d3b9a4619f23e6a19694ac0fdfd3650 Parents: d69601b Author: Willem Jiang <willem.ji...@gmail.com> Authored: Tue Nov 11 16:12:21 2014 +0800 Committer: Willem Jiang <willem.ji...@gmail.com> Committed: Tue Nov 11 16:12:21 2014 +0800 ---------------------------------------------------------------------- .../netty/NettyClientBossPoolBuilder.java | 18 ++++++++++++++++++ .../camel/component/netty/NettyProducer.java | 10 ++++++++++ .../netty/NettyServerBossPoolBuilder.java | 20 +++++++++++++++++++- .../component/netty/NettyWorkerPoolBuilder.java | 20 +++++++++++++++++++- 4 files changed, 66 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/d1c06a45/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyClientBossPoolBuilder.java ---------------------------------------------------------------------- diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyClientBossPoolBuilder.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyClientBossPoolBuilder.java index a775165..cc9bfb0 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyClientBossPoolBuilder.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyClientBossPoolBuilder.java @@ -16,11 +16,14 @@ */ package org.apache.camel.component.netty; +import java.util.concurrent.Executor; import java.util.concurrent.Executors; import org.jboss.netty.channel.socket.nio.BossPool; import org.jboss.netty.channel.socket.nio.NioClientBossPool; +import org.jboss.netty.util.ThreadNameDeterminer; import org.jboss.netty.util.Timer; +import org.jboss.netty.util.internal.ExecutorUtil; /** * A builder to create Netty {@link org.jboss.netty.channel.socket.nio.BossPool} which can be used for sharing boss pools @@ -75,4 +78,19 @@ public final class NettyClientBossPoolBuilder { BossPool build() { return new NioClientBossPool(Executors.newCachedThreadPool(), bossCount, timer, new CamelNettyThreadNameDeterminer(pattern, name)); } + + class CamelNioClientBossPool extends NioClientBossPool { + private Executor executor; + CamelNioClientBossPool(Executor bossExecutor, int bossCount, Timer timer, ThreadNameDeterminer determiner) { + super(bossExecutor, bossCount, timer, determiner); + executor = bossExecutor; + } + + // Just make sure we shutdown the executor; + public void shutdown() { + super.shutdown(); + ExecutorUtil.shutdownNow(executor); + } + + } } http://git-wip-us.apache.org/repos/asf/camel/blob/d1c06a45/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java index e317e76..cad1ca8 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java @@ -172,6 +172,16 @@ public class NettyProducer extends DefaultAsyncProducer { pool.close(); pool = null; } + + if (channelFactory != null) { + channelFactory.shutdown(); + channelFactory = null; + } + + if (datagramChannelFactory != null) { + datagramChannelFactory.shutdown(); + datagramChannelFactory = null; + } super.doStop(); } http://git-wip-us.apache.org/repos/asf/camel/blob/d1c06a45/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyServerBossPoolBuilder.java ---------------------------------------------------------------------- diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyServerBossPoolBuilder.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyServerBossPoolBuilder.java index 1bb4ca3..3be5a64 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyServerBossPoolBuilder.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyServerBossPoolBuilder.java @@ -16,10 +16,13 @@ */ package org.apache.camel.component.netty; +import java.util.concurrent.Executor; import java.util.concurrent.Executors; import org.jboss.netty.channel.socket.nio.BossPool; import org.jboss.netty.channel.socket.nio.NioServerBossPool; +import org.jboss.netty.util.ThreadNameDeterminer; +import org.jboss.netty.util.internal.ExecutorUtil; /** * A builder to create Netty {@link org.jboss.netty.channel.socket.nio.BossPool} which can be used for sharing boss pools @@ -62,6 +65,21 @@ public final class NettyServerBossPoolBuilder { * Creates a new boss pool. */ BossPool build() { - return new NioServerBossPool(Executors.newCachedThreadPool(), bossCount, new CamelNettyThreadNameDeterminer(pattern, name)); + return new CamelNioServerBossPool(Executors.newCachedThreadPool(), bossCount, new CamelNettyThreadNameDeterminer(pattern, name)); + } + + class CamelNioServerBossPool extends NioServerBossPool { + private Executor executor; + CamelNioServerBossPool(Executor bossExecutor, int bossCount, ThreadNameDeterminer determiner) { + super(bossExecutor, bossCount, determiner); + executor = bossExecutor; + } + + // Just make sure we shutdown the executor; + public void shutdown() { + super.shutdown(); + ExecutorUtil.shutdownNow(executor); + } + } } http://git-wip-us.apache.org/repos/asf/camel/blob/d1c06a45/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyWorkerPoolBuilder.java ---------------------------------------------------------------------- diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyWorkerPoolBuilder.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyWorkerPoolBuilder.java index 6b615e1..5b6253a 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyWorkerPoolBuilder.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyWorkerPoolBuilder.java @@ -16,10 +16,13 @@ */ package org.apache.camel.component.netty; +import java.util.concurrent.Executor; import java.util.concurrent.Executors; import org.jboss.netty.channel.socket.nio.NioWorkerPool; import org.jboss.netty.channel.socket.nio.WorkerPool; +import org.jboss.netty.util.ThreadNameDeterminer; +import org.jboss.netty.util.internal.ExecutorUtil; /** * A builder to create Netty {@link WorkerPool} which can be used for sharing worker pools @@ -64,9 +67,24 @@ public final class NettyWorkerPoolBuilder { */ public WorkerPool build() { int count = workerCount > 0 ? workerCount : NettyHelper.DEFAULT_IO_THREADS; - workerPool = new NioWorkerPool(Executors.newCachedThreadPool(), count, new CamelNettyThreadNameDeterminer(pattern, name)); + workerPool = new CamelNioWorkerPool(Executors.newCachedThreadPool(), count, new CamelNettyThreadNameDeterminer(pattern, name)); return workerPool; } + + class CamelNioWorkerPool extends NioWorkerPool { + private Executor executor; + CamelNioWorkerPool(Executor workerExecutor, int count, ThreadNameDeterminer determiner) { + super(workerExecutor, count, determiner); + executor = workerExecutor; + } + + // Just make sure we shutdown the executor; + public void shutdown() { + super.shutdown(); + ExecutorUtil.shutdownNow(executor); + } + + } /** * Shutdown the created worker pool