You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ga...@apache.org on 2016/04/01 03:33:45 UTC
activemq-artemis git commit: Fix thread leak in
SoWriteTimeoutClientTest (exclude a thread from leak checking)
Repository: activemq-artemis
Updated Branches:
refs/heads/refactor-openwire cae8a545a -> 298f274c4
Fix thread leak in SoWriteTimeoutClientTest
(exclude a thread from leak checking)
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/298f274c
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/298f274c
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/298f274c
Branch: refs/heads/refactor-openwire
Commit: 298f274c4965a0628f2af5d39020fb3ecb1af5e3
Parents: cae8a54
Author: Howard Gao <ho...@gmail.com>
Authored: Fri Apr 1 09:31:47 2016 +0800
Committer: Howard Gao <ho...@gmail.com>
Committed: Fri Apr 1 09:31:47 2016 +0800
----------------------------------------------------------------------
.../artemis/tests/util/ThreadLeakCheckRule.java | 14 +++++
.../transport/SoWriteTimeoutClientTest.java | 64 +++++++++++++-------
2 files changed, 57 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/298f274c/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
index 846d31b..232d3ae 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ThreadLeakCheckRule.java
@@ -17,7 +17,9 @@
package org.apache.activemq.artemis.tests.util;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import org.junit.Assert;
import org.junit.rules.ExternalResource;
@@ -26,6 +28,7 @@ import org.junit.rules.ExternalResource;
* This is useful to make sure you won't have leaking threads between tests
*/
public class ThreadLeakCheckRule extends ExternalResource {
+ private static Set<String> extraThreads = new HashSet<String>();
boolean enabled = true;
@@ -94,6 +97,11 @@ public class ThreadLeakCheckRule extends ExternalResource {
}
+ public static void addExtraThreads(String... threads) {
+ for (String th : threads) {
+ extraThreads.add(th);
+ }
+ }
private boolean checkThread() {
boolean failedThread = false;
@@ -183,6 +191,9 @@ public class ThreadLeakCheckRule extends ExternalResource {
// Static workers used by MQTT client.
return true;
}
+ else if (extraThreads.contains(threadName)) {
+ return true;
+ }
else {
for (StackTraceElement element : thread.getStackTrace()) {
if (element.getClassName().contains("org.jboss.byteman.agent.TransformListener")) {
@@ -194,4 +205,7 @@ public class ThreadLeakCheckRule extends ExternalResource {
}
+ public static void clearExtraThreads() {
+ extraThreads.clear();
+ }
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/298f274c/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
----------------------------------------------------------------------
diff --git a/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java b/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
index 0998599..48c36cf 100644
--- a/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
+++ b/tests/activemq5-unit-tests/src/test/java/org/apache/activemq/transport/SoWriteTimeoutClientTest.java
@@ -26,17 +26,21 @@ import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
+import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.jms.server.config.impl.JMSConfigurationImpl;
import org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS;
+import org.apache.activemq.artemis.tests.util.ThreadLeakCheckRule;
import org.apache.activemq.broker.artemiswrapper.OpenwireArtemisBaseTest;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.util.SocketProxy;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,6 +51,17 @@ public class SoWriteTimeoutClientTest extends OpenwireArtemisBaseTest {
private String messageTextPrefix = "";
private EmbeddedJMS server;
+ @BeforeClass
+ public static void beforeTest() throws Exception {
+ //this thread keeps alive in original test too. Exclude it.
+ ThreadLeakCheckRule.addExtraThreads("WriteTimeoutFilter-Timeout-1");
+ }
+
+ @AfterClass
+ public static void afterTest() throws Exception {
+ ThreadLeakCheckRule.clearExtraThreads();
+ }
+
@Before
public void setUp() throws Exception {
Configuration config = this.createConfig(0);
@@ -80,34 +95,41 @@ public class SoWriteTimeoutClientTest extends OpenwireArtemisBaseTest {
ActiveMQConnectionFactory pFactory = new ActiveMQConnectionFactory("failover:(" + proxy.getUrl() + "?soWriteTimeout=4000&sleep=500)?jms.useAsyncSend=true&trackMessages=true&maxCacheSize=6638400");
final Connection pc = pFactory.createConnection();
- pc.start();
- proxy.pause();
-
- final int messageCount = 20;
- ExecutorService executorService = Executors.newCachedThreadPool();
- executorService.execute(new Runnable() {
- @Override
- public void run() {
- try {
- sendMessages(pc, dest, messageCount);
- }
- catch (Exception ignored) {
- ignored.printStackTrace();
+ try {
+ pc.start();
+ proxy.pause();
+
+ final int messageCount = 20;
+ ExecutorService executorService = Executors.newCachedThreadPool();
+ executorService.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sendMessages(pc, dest, messageCount);
+ }
+ catch (Exception ignored) {
+ ignored.printStackTrace();
+ }
}
+ });
+
+ // wait for timeout and reconnect
+ TimeUnit.SECONDS.sleep(8);
+ proxy.goOn();
+ for (int i = 0; i < messageCount; i++) {
+ TextMessage m = (TextMessage) consumer.receive(10000);
+ Assert.assertNotNull("Got message " + i + " after reconnect", m);
}
- });
- // wait for timeout and reconnect
- TimeUnit.SECONDS.sleep(8);
- proxy.goOn();
- for (int i = 0; i < messageCount; i++) {
- Assert.assertNotNull("Got message " + i + " after reconnect", consumer.receive(10000));
+ Assert.assertNull(consumer.receive(5000));
+ }
+ finally {
+ pc.close();
}
-
- Assert.assertNull(consumer.receive(5000));
}
finally {
proxy.close();
+ c.close();
}
}