Also, where are the existing unit tests in this area that should be
extended or modified? As far as I can see it appears that this inactivity
code has not been tested.


On Tue, Sep 3, 2013 at 7:21 PM, Paul Gale <paul.n.g...@gmail.com> wrote:

> This change won't work anyways.
>
> How do you propose one unit test multi-threaded code in a repeatable
> manner in Java?  :) Examples and guidance much appreciated.
>
>
> On Tue, Sep 3, 2013 at 6:55 PM, Timothy Bish (JIRA) <j...@apache.org>wrote:
>
>>
>>     [
>> https://issues.apache.org/jira/browse/AMQ-4710?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13757200#comment-13757200]
>>
>> Timothy Bish commented on AMQ-4710:
>> -----------------------------------
>>
>> You'd need to submit the change as a patch, can't tell what's changed
>> above.  Also tests to show there's an issue.
>>
>> > 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
>> >
>> > 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
>>
>
>

Reply via email to