activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andy Wilkinson (JIRA)" <>
Subject [jira] [Created] (AMQ-4710) The first heart-beat after a connection becomes idle isn't sent as quickly as it should be
Date Mon, 02 Sep 2013 12:22:53 GMT
Andy Wilkinson created AMQ-4710:

             Summary: The first heart-beat after a connection becomes idle isn't sent as quickly
as it should be
                 Key: AMQ-4710
             Project: ActiveMQ
          Issue Type: Bug
          Components: stomp
    Affects Versions: 5.8.0
            Reporter: Andy Wilkinson

After ActiveMQ sends a stomp frame, it may not send a heart-beat for up to almost 2x the negotiated

The following test should illustrate the problem:

import org.junit.Test;

import static org.junit.Assert.*;

public class ActiveMqHeartbeatTests {

	public void heartbeats() throws Exception {
		BrokerService broker = createAndStartBroker();
		Socket socket = null;
		try {
			socket = new Socket("localhost", 61613);
			byte[] connectFrame = "CONNECT\nheart-beat:0,10000\naccept-version:1.2\n\n\0".getBytes();
			byte[] buffer = new byte[4096];

			long lastReadTime = System.currentTimeMillis();

			while (true) {
				int read = socket.getInputStream().read(buffer);
				byte[] frame = Arrays.copyOf(buffer, read);
				long now = System.currentTimeMillis();
				long timeSinceLastRead = now - lastReadTime;
				lastReadTime = now;
				System.out.println(new String(frame));
				System.out.println("Time since last read: " + timeSinceLastRead + "ms");
				if (timeSinceLastRead > 15000) {
					fail("Data not received for " + timeSinceLastRead + "ms");
		} finally {
			if (socket != null) {

	private BrokerService createAndStartBroker() throws Exception {
		BrokerService broker = new BrokerService();

		return broker;


For the initial read of the CONNECTED frame I see:

Time since last read: 49ms

However, it's then almost 20 seconds before a heart-beat's sent:

Time since last read: 19994ms

If I comment out the fail(…) line in the test, after the first heartbeat taking almost 20000ms
to be sent, things settle down and a heartbeat's received every 10000ms.

It looks like the write checker wakes up every 10000ms. The first time it wakes up, it notices
that the CONNECTED frame was sent and does nothing. It then sleeps for a further 10000ms before
checking again. As the CONNECTED frame was sent very early in the first 10000ms window, this
leads to it taking almost 20000ms for the first heart-beat to be sent. From this point, as
no further data frames are sent, the write checker wakes up and sends a heart-beat every 10000ms.

In short, I don't think ActiveMQ is adhering to the requirement that "the sender MUST send
new data over the network connection at least every <n> milliseconds".

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:

View raw message