INT-4379: JMS OG Shutdown reply container on stop

JIRA: https://jira.spring.io/browse/INT-4379

- shutdown the container when the gateway is stopped

Also, improve test suite

- at the end of the tests, hundreds of threads are running, some caused by the above
  but others because `TaskExecutor`s are not shut down
- reduce the number of iterations in the JMS pipeline tests to speed things up
- change more tests to extend `ActiveMQMultiContextTests`, to keep a single broker up

__cherry-pick to 4.3.x__

# Conflicts:
#	spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java
#	spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsOutboundGatewayTests.java
#	spring-integration-jms/src/test/java/org/springframework/integration/jms/OutboundGatewayConnectionTests.java
#	spring-integration-jms/src/test/java/org/springframework/integration/jms/OutboundGatewayFunctionTests.java
#	spring-integration-jms/src/test/java/org/springframework/integration/jms/PollableJmsChannelTests.java
#	spring-integration-jms/src/test/java/org/springframework/integration/jms/SubscribableJmsChannelTests.java
This commit is contained in:
Gary Russell
2018-01-18 14:06:17 -05:00
committed by Artem Bilan
parent d2fb79e846
commit 34c938fe4f
10 changed files with 193 additions and 197 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -156,6 +156,8 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp
private volatile long idleReplyContainerTimeout;
private volatile boolean wasStopped;
private ScheduledFuture<?> idleTask;
/**
@@ -676,6 +678,10 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp
if (this.replyContainer != null) {
TaskScheduler taskScheduler = getTaskScheduler();
if (this.idleReplyContainerTimeout <= 0) {
if (this.wasStopped) {
this.replyContainer.initialize();
this.wasStopped = false;
}
this.replyContainer.start();
}
else {
@@ -695,7 +701,8 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler imp
public void stop() {
synchronized (this.lifeCycleMonitor) {
if (this.replyContainer != null) {
this.replyContainer.stop();
this.replyContainer.shutdown();
this.wasStopped = true;
this.deleteDestinationIfTemporary(this.replyContainer.getDestination());
if (this.reaper != null) {
this.reaper.cancel(false);

View File

@@ -28,6 +28,7 @@ import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
@@ -69,13 +70,11 @@ import org.springframework.util.ObjectUtils;
* @author Artem Bilan
* @since 2.2.4
*/
public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
public class JmsOutboundGatewayTests extends ActiveMQMultiContextTests {
private final Log logger = LogFactory.getLog(this.getClass());
public JmsOutboundGatewayTests() {
super("org.springframework.integration", "org.springframework.jms", "org.apache");
}
@Test
public void testContainerBeanNameWhenNoGatewayBeanName() {
@@ -100,16 +99,11 @@ public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
gateway.setUseReplyContainer(true);
ReplyContainerProperties replyContainerProperties = new ReplyContainerProperties();
final List<Throwable> errors = new ArrayList<Throwable>();
ExecutorService exec = Executors.newFixedThreadPool(10);
ErrorHandlingTaskExecutor errorHandlingTaskExecutor =
new ErrorHandlingTaskExecutor(Executors.newFixedThreadPool(10), new ErrorHandler() {
@Override
public void handleError(Throwable t) {
logger.info("Error:", t);
errors.add(t);
throw new RuntimeException(t);
}
new ErrorHandlingTaskExecutor(exec, t -> {
errors.add(t);
throw new RuntimeException(t);
});
replyContainerProperties.setTaskExecutor(errorHandlingTaskExecutor);
replyContainerProperties.setRecoveryInterval(100L);
@@ -173,6 +167,7 @@ public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
}
finally {
gateway.stop();
exec.shutdownNow();
}
}
@@ -192,13 +187,8 @@ public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
gateway.setReceiveTimeout(60000);
gateway.afterPropertiesSet();
gateway.start();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
gateway.handleMessage(new GenericMessage<String>("foo"));
}
});
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> gateway.handleMessage(new GenericMessage<String>("foo")));
CachingConnectionFactory connectionFactory2 = new CachingConnectionFactory(
new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"));
JmsTemplate template = new JmsTemplate(connectionFactory2);
@@ -224,6 +214,7 @@ public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
gateway.stop();
connectionFactory1.destroy();
connectionFactory2.destroy();
exec.shutdownNow();
}
@Test
@@ -243,13 +234,8 @@ public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
gateway.setCorrelationKey("JMSCorrelationID");
gateway.afterPropertiesSet();
gateway.start();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
gateway.handleMessage(new GenericMessage<String>("foo"));
}
});
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> gateway.handleMessage(new GenericMessage<String>("foo")));
CachingConnectionFactory connectionFactory2 = new CachingConnectionFactory(
new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"));
JmsTemplate template = new JmsTemplate(connectionFactory2);
@@ -276,6 +262,7 @@ public class JmsOutboundGatewayTests extends LogAdjustingTestSupport {
gateway.stop();
connectionFactory1.destroy();
connectionFactory2.destroy();
exec.shutdownNow();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,11 +36,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* //INT-2275
*
* @author Artem Bilan
* @author Gary Russell
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@DirtiesContext
public class JmsOutboundInsideChainTests {
public class JmsOutboundInsideChainTests extends ActiveMQMultiContextTests {
@Autowired
private MessageChannel outboundChainChannel;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
@@ -37,12 +38,13 @@ import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.integration.context.IntegrationContextUtils;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@@ -57,14 +59,15 @@ public class OutboundGatewayConnectionTests {
private Destination replyQueue1 = new ActiveMQQueue("reply1");
@Test @Ignore // need a more reliable stop/start for AMQ
@Test
@Ignore // need a more reliable stop/start for AMQ
public void testContainerWithDestBrokenConnection() throws Exception {
BeanFactory beanFactory = mock(BeanFactory.class);
when(beanFactory.containsBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)).thenReturn(true);
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
BrokerService broker = new BrokerService();
@@ -82,15 +85,14 @@ public class OutboundGatewayConnectionTests {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -116,15 +118,13 @@ public class OutboundGatewayConnectionTests {
final CountDownLatch latch3 = new CountDownLatch(1);
final CountDownLatch latch4 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
latch3.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch4.countDown();
}
exec.execute(() -> {
latch3.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch4.countDown();
}
});
assertTrue(latch3.await(10, TimeUnit.SECONDS));
@@ -147,6 +147,7 @@ public class OutboundGatewayConnectionTests {
broker.stop();
scheduler.destroy();
exec.shutdownNow();
}
}

View File

@@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
@@ -40,7 +41,6 @@ import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.integration.context.IntegrationContextUtils;
import org.springframework.integration.test.support.LogAdjustingTestSupport;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.jms.JmsException;
import org.springframework.jms.connection.CachingConnectionFactory;
@@ -56,7 +56,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
* @since 2.2
*
*/
public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
public class OutboundGatewayFunctionTests extends ActiveMQMultiContextTests {
private static Destination requestQueue1 = new ActiveMQQueue("request1");
@@ -85,7 +85,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
ConnectionFactory connectionFactory = getConnectionFactory();
@@ -99,16 +99,14 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -130,6 +128,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
scheduler.destroy();
exec.shutdown();
}
@Test
@@ -139,7 +138,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
gateway.setConnectionFactory(getConnectionFactory());
@@ -151,16 +150,14 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -183,6 +180,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
scheduler.destroy();
exec.shutdownNow();
}
@Test
@@ -192,7 +190,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
gateway.setConnectionFactory(getConnectionFactory());
@@ -205,16 +203,14 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -236,6 +232,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
scheduler.destroy();
exec.shutdownNow();
}
@Test
@@ -245,7 +242,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
gateway.setConnectionFactory(getConnectionFactory());
@@ -257,16 +254,14 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -289,6 +284,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
scheduler.destroy();
exec.shutdownNow();
}
@Test
@@ -298,7 +294,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
gateway.setConnectionFactory(getConnectionFactory());
@@ -311,16 +307,14 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -342,6 +336,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
scheduler.destroy();
exec.shutdownNow();
}
@Test
@@ -352,7 +347,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
gateway.setConnectionFactory(getConnectionFactory());
@@ -363,16 +358,14 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
final AtomicReference<Object> reply = new AtomicReference<Object>();
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
}
finally {
latch2.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
latch1.countDown();
try {
reply.set(gateway.handleRequestMessage(new GenericMessage<>("foo")));
}
finally {
latch2.countDown();
}
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
@@ -395,6 +388,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
scheduler.destroy();
exec.shutdownNow();
}
@Test
@@ -404,7 +398,7 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
when(beanFactory.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class))
.thenReturn(scheduler);
.thenReturn(scheduler);
final JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setBeanFactory(beanFactory);
gateway.setConnectionFactory(getConnectionFactory());
@@ -417,33 +411,13 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.setReceiveTimeout(20000);
gateway.afterPropertiesSet();
gateway.start();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(getConnectionFactory());
template.setReceiveTimeout(20000);
receiveAndSend(template);
receiveAndSend(template);
}
private void receiveAndSend(JmsTemplate template) {
javax.jms.Message request = template.receive(requestQueue7);
final javax.jms.Message jmsReply = request;
try {
template.send(request.getJMSReplyTo(), new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return jmsReply;
}
});
}
catch (JmsException e) {
}
catch (JMSException e) {
}
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(getConnectionFactory());
template.setReceiveTimeout(20000);
receiveAndSend(template);
receiveAndSend(template);
});
assertNotNull(gateway.handleRequestMessage(new GenericMessage<String>("foo")));
@@ -460,6 +434,17 @@ public class OutboundGatewayFunctionTests extends LogAdjustingTestSupport {
gateway.stop();
assertFalse(container.isRunning());
scheduler.destroy();
exec.shutdownNow();
}
private void receiveAndSend(JmsTemplate template) {
javax.jms.Message request = template.receive(requestQueue7);
final javax.jms.Message jmsReply = request;
try {
template.send(request.getJMSReplyTo(), session -> jmsReply);
}
catch (JmsException | JMSException e) {
}
}
private ConnectionFactory getConnectionFactory() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,9 +28,11 @@ import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Session;
@@ -61,7 +63,7 @@ import org.springframework.messaging.support.GenericMessage;
* @author Gunnar Hillert
* @author Artem Bilan
*/
public class PollableJmsChannelTests {
public class PollableJmsChannelTests extends ActiveMQMultiContextTests {
private ActiveMQConnectionFactory connectionFactory;
@@ -190,14 +192,10 @@ public class PollableJmsChannelTests {
assertTrue(sent1);
final AtomicReference<javax.jms.Message> message = new AtomicReference<javax.jms.Message>();
final CountDownLatch latch1 = new CountDownLatch(1);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
message.set(receiver.receive(queue));
latch1.countDown();
}
ExecutorService exec = Executors.newSingleThreadExecutor();
exec.execute(() -> {
message.set(receiver.receive(queue));
latch1.countDown();
});
assertTrue(latch1.await(10, TimeUnit.SECONDS));
assertNotNull(message.get());
@@ -208,20 +206,16 @@ public class PollableJmsChannelTests {
final CountDownLatch latch2 = new CountDownLatch(1);
boolean sent2 = channel.send(MessageBuilder.withPayload("foo").setPriority(6).build());
assertTrue(sent2);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
message.set(receiver.receive(queue));
latch2.countDown();
}
exec.execute(() -> {
message.set(receiver.receive(queue));
latch2.countDown();
});
assertTrue(latch2.await(10, TimeUnit.SECONDS));
assertNotNull(message.get());
assertEquals(6, message.get().getJMSPriority());
assertTrue(message.get().getJMSExpiration() <= System.currentTimeMillis() + ttl);
assertTrue(message.get().toString().contains("persistent = false"));
exec.shutdownNow();
}
@Test

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -70,7 +70,7 @@ import org.springframework.messaging.support.GenericMessage;
* @author Artem Bilan
* @since 2.0
*/
public class SubscribableJmsChannelTests {
public class SubscribableJmsChannelTests extends ActiveMQMultiContextTests {
private static final int TIMEOUT = 30000;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
@@ -28,6 +28,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -39,6 +40,7 @@ import org.springframework.integration.jms.ActiveMQMultiContextTests;
import org.springframework.integration.jms.config.ActiveMqTestUtils;
import org.springframework.integration.test.support.LongRunningIntegrationTest;
import org.springframework.messaging.support.GenericMessage;
/**
* @author Oleg Zhurakousky
* @author Gary Russell
@@ -46,7 +48,7 @@ import org.springframework.messaging.support.GenericMessage;
*/
public class PipelineJmsTests extends ActiveMQMultiContextTests {
private final Executor executor = Executors.newFixedThreadPool(30);
private final ExecutorService executor = Executors.newFixedThreadPool(30);
private static final Log logger = LogFactory.getLog(PipelineJmsTests.class);
@@ -58,7 +60,12 @@ public class PipelineJmsTests extends ActiveMQMultiContextTests {
LogManager.getLogger(getClass()).setLevel(Level.INFO);
}
int requests = 50;
@After
public void tearDown() {
this.executor.shutdownNow();
}
int requests = 5;
/**
* jms:out -> jms:in -> randomTimeoutProcess ->
@@ -162,6 +169,7 @@ public class PipelineJmsTests extends ActiveMQMultiContextTests {
for (int i = 0; i < requests; i++) {
final int y = i;
executor.execute(new Runnable() {
@Override
public void run() {
try {
@@ -189,7 +197,7 @@ public class PipelineJmsTests extends ActiveMQMultiContextTests {
logger.info("Failure: " + failureCounter.get());
// technically all we care that its > 0,
// but reality of this test it has to be something more then 0
assertTrue(successCounter.get() > 10);
assertTrue(successCounter.get() > 1);
assertEquals(0, failureCounter.get());
assertEquals(requests, successCounter.get() + timeoutCounter.get());
context.close();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertTrue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -31,6 +31,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -43,6 +44,7 @@ import org.springframework.integration.jms.config.ActiveMqTestUtils;
import org.springframework.integration.test.support.LongRunningIntegrationTest;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.GenericMessage;
/**
* @author Oleg Zhurakousky
* @author Gary Russell
@@ -51,7 +53,7 @@ import org.springframework.messaging.support.GenericMessage;
*/
public class PipelineNamedReplyQueuesJmsTests extends ActiveMQMultiContextTests {
private final Executor executor = Executors.newFixedThreadPool(30);
private final ExecutorService executor = Executors.newFixedThreadPool(30);
private static final Log logger = LogFactory.getLog(PipelineJmsTests.class);
@@ -63,7 +65,12 @@ public class PipelineNamedReplyQueuesJmsTests extends ActiveMQMultiContextTests
LogManager.getLogger(getClass()).setLevel(Level.INFO);
}
int requests = 50;
@After
public void tearDown() {
this.executor.shutdownNow();
}
int requests = 5;
/**
* jms:out(reply-destination-name="pipeline01-01") -> jms:in -> randomTimeoutProcess ->
@@ -175,6 +182,7 @@ public class PipelineNamedReplyQueuesJmsTests extends ActiveMQMultiContextTests
for (int i = 1000000; i < 1000000 + requests * 100000; i += 100000) {
final int y = i;
executor.execute(new Runnable() {
@Override
public void run() {
try {
@@ -197,7 +205,7 @@ public class PipelineNamedReplyQueuesJmsTests extends ActiveMQMultiContextTests
assertTrue(latch.await(120, TimeUnit.SECONDS));
// technically all we care that its > 0,
// but reality of this test it has to be something more then 0
assertTrue(successCounter.get() > 10);
assertTrue(successCounter.get() > 1);
assertEquals(0, failureCounter.get());
assertEquals(requests, successCounter.get() + timeoutCounter.get());
return timeoutCounter.get();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,11 +19,9 @@ package org.springframework.integration.jms.request_reply;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
@@ -56,6 +54,7 @@ import org.springframework.jms.listener.SessionAwareMessageListener;
import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.messaging.MessageDeliveryException;
import org.springframework.messaging.support.GenericMessage;
/**
* @author Oleg Zhurakousky
* @author Gary Russell
@@ -73,7 +72,8 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
public void messageCorrelationBasedOnRequestMessageId() throws Exception {
ActiveMqTestUtils.prepare();
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("producer-temp-reply-consumers.xml", this.getClass());
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("producer-temp-reply-consumers.xml", this.getClass());
RequestReplyExchanger gateway = context.getBean(RequestReplyExchanger.class);
CachingConnectionFactory connectionFactory = context.getBean(CachingConnectionFactory.class);
final JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
@@ -187,7 +187,7 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
BrokerService broker = new BrokerService();
broker.setPersistent(false);
broker.setUseJmx(false);
broker.setTransportConnectorURIs(new String[]{"tcp://localhost:61623"});
broker.setTransportConnectorURIs(new String[] { "tcp://localhost:61623" });
broker.setDeleteAllMessagesOnStartup(true);
broker.start();
@@ -223,7 +223,7 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("mult-producer-and-consumers-temp-reply.xml", this.getClass());
final RequestReplyExchanger gateway = context.getBean(RequestReplyExchanger.class);
Executor executor = Executors.newFixedThreadPool(10);
ExecutorService executor = Executors.newFixedThreadPool(10);
final int testNumbers = 100;
final CountDownLatch latch = new CountDownLatch(testNumbers);
final AtomicInteger failures = new AtomicInteger();
@@ -232,6 +232,7 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
for (int i = 0; i < testNumbers; i++) {
final int y = i;
executor.execute(new Runnable() {
@Override
public void run() {
try {
@@ -266,6 +267,7 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
assertEquals(0, failures.get());
assertEquals(0, timeouts.get());
context.close();
executor.shutdownNow();
}
private void print(AtomicInteger failures, AtomicInteger timeouts, AtomicInteger missmatches, long echangesProcessed) {
@@ -273,20 +275,10 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
logger.info(echangesProcessed + " exchanges processed");
logger.info("Failures: " + failures.get());
logger.info("Timeouts: " + timeouts.get());
logger.info("Missmatches: " + missmatches.get());
logger.info("Mismatches: " + missmatches.get());
logger.info("============================");
}
public static class MyRandomlySlowService {
Random random = new Random();
List<Integer> list = new ArrayList<Integer>();
public String secho(String value) throws Exception {
int i = random.nextInt(2000);
Thread.sleep(i);
return value;
}
}
private Object extractPayload(Message jmsMessage) {
try {
return converter.fromMessage(jmsMessage);
@@ -297,4 +289,17 @@ public class RequestReplyScenariosWithTempReplyQueuesTests extends ActiveMQMulti
}
return null;
}
public static class MyRandomlySlowService {
Random random = new Random();
public String echo(String value) throws Exception {
int i = random.nextInt(2000);
Thread.sleep(i);
return value;
}
}
}