If any of the ActiveMQ committers could take a look at my patch for this Jira issue I would really appreciate the feedback as I'd like to incorporate it into 5.8.0.
Thanks, Paul On Mon, Sep 9, 2013 at 10:13 AM, Paul Gale (JIRA) <[email protected]> wrote: > > [ > https://issues.apache.org/jira/browse/AMQ-4710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel] > > Paul Gale updated AMQ-4710: > --------------------------- > > Comment: was deleted > > (was: Updated patch containing fix for Jira AMQ-4710. Improved the > checking for when to recreate the write checker timer task. Previous patch > attachment has been deleted.) > > > The first heart-beat after a connection becomes idle isn't sent as > quickly as it should be > > > ------------------------------------------------------------------------------------------ > > > > Key: AMQ-4710 > > URL: https://issues.apache.org/jira/browse/AMQ-4710 > > Project: ActiveMQ > > Issue Type: Bug > > Components: stomp > > Affects Versions: 5.8.0 > > Reporter: Andy Wilkinson > > Attachments: amq-4710.diff > > > > > > After ActiveMQ sends a stomp frame, it may not send a heart-beat for up > to almost 2x the negotiated interval. > > The following test should illustrate the problem: > > {code} > > import org.junit.Test; > > import static org.junit.Assert.*; > > public class ActiveMqHeartbeatTests { > > @Test > > 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(); > > socket.getOutputStream().write(connectFrame); > > 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) { > > socket.close(); > > } > > broker.stop(); > > } > > } > > private BrokerService createAndStartBroker() throws Exception { > > BrokerService broker = new BrokerService(); > > broker.addConnector("stomp://localhost:61613"); > > broker.setStartAsync(false); > > broker.setDeleteAllMessagesOnStartup(true); > > broker.start(); > > return broker; > > } > > } > > {code} > > For the initial read of the CONNECTED frame I see: > > {noformat} > > Time since last read: 49ms > > {noformat} > > However, it's then almost 20 seconds before a heart-beat's sent: > > {noformat} > > Time since last read: 19994ms > > {noformat} > > 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: http://www.atlassian.com/software/jira >
