/*
* 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.activemq.artemis.tests.integration.stomp;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import org.apache.activemq.artemis.jms.server.JMSServerManager;
import org.apache.activemq.artemis.tests.integration.stomp.util.ClientStompFrame;
import org.junit.Test;
public class StompConnectionCleanupTest extends StompTest {
private static final long CONNECTION_TTL = 2000;
// ARTEMIS-231
@Test
public void testConnectionCleanupWithTopicSubscription() throws Exception {
conn.connect(defUser, defPass);
subscribeTopic(conn, null, "auto", null);
// Now we wait until the connection is cleared on the server, which will happen some time after ttl, since no data
// is being sent
long start = System.currentTimeMillis();
while (true) {
int connCount = server.getActiveMQServer().getRemotingService().getConnections().size();
int sessionCount = server.getActiveMQServer().getSessions().size();
// All connections and sessions should be timed out including STOMP + JMS connection
if (connCount == 0 && sessionCount == 0) {
break;
}
Thread.sleep(10);
if (System.currentTimeMillis() - start > 10000) {
fail("Timed out waiting for connection to be cleared up");
}
}
}
@Test
public void testConnectionCleanup() throws Exception {
conn.connect(defUser, defPass);
subscribe(conn, null, "auto", null);
send(conn, getQueuePrefix() + getQueueName(), null, "Hello World");
ClientStompFrame frame = conn.receiveFrame(10000);
assertTrue(frame.getCommand().equals("MESSAGE"));
assertTrue(frame.getHeader("destination").equals(getQueuePrefix() + getQueueName()));
// Now we wait until the connection is cleared on the server, which will happen some time after ttl, since no data
// is being sent
long start = System.currentTimeMillis();
while (true) {
int connCount = server.getActiveMQServer().getRemotingService().getConnections().size();
int sessionCount = server.getActiveMQServer().getSessions().size();
// All connections and sessions should be timed out including STOMP + JMS connection
if (connCount == 0 && sessionCount == 0) {
break;
}
Thread.sleep(10);
if (System.currentTimeMillis() - start > 10000) {
fail("Timed out waiting for connection to be cleared up");
}
}
}
@Test
public void testConnectionNotCleanedUp() throws Exception {
conn.connect(defUser, defPass);
MessageConsumer consumer = session.createConsumer(queue);
long time = CONNECTION_TTL * 3;
long start = System.currentTimeMillis();
//Send msgs for an amount of time > connection_ttl make sure connection is not closed
while (true) {
//Send and receive a msg
send(conn, getQueuePrefix() + getQueueName(), null, "Hello World");
Message msg = consumer.receive(1000);
assertNotNull(msg);
Thread.sleep(100);
if (System.currentTimeMillis() - start > time) {
break;
}
}
}
@Override
protected JMSServerManager createServer() throws Exception {
JMSServerManager s = super.createServer();
s.getActiveMQServer().getConfiguration().setConnectionTTLOverride(CONNECTION_TTL);
return s;
}
}