The ajax servlet in 5.3 will often 'stall', and fail to deliver messages for about 25 seconds at a time. This behavior is not present in the 5.4 snapshots I've tried recently. Everything seems to work perfectly with that code. I've run tests up to a few hundred messages without missing one or having any of delays. Dejan stated there has been some refactoring work going on in the ajax servlet code, and it seems like this has definitely improved things.

I'm writing now:
1. as an FYI to other people who might be having problems with the ajax code in 5.3, and 2. to ask if it's possible that these 5.4 changes merged back into 5.3, since 5.4 is not yet stable/released.

More details:

I think that MessageListenerServlet is entering a sleeping/suspended state when it should not.
http://fisheye6.atlassian.com/browse/activemq/branches/activemq-5.3/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java?r=HEAD
In this link, line 72 sets "private long maximumReadTimeout = 25000;". This is used in "continuation.suspend(timeout);" on line 301. I'm not exactly sure why this is happening, but this timeout value very closely matches the delays I see in my message delivery.

In my testing, I created an HTML/JavaScript page which uses the ActiveMQ ajax connector to subscribe to a topic, and then publish 1 message/second to this topic. The first time the page loads, this works fine. I receive messages immediately. When I reload the page, however, it takes roughly 25 seconds for the first message to arrive. The first one I get is either #24 or #25, and all previous messages are not delivered. If I close the window and open a new one, message delivery is normal. When I reload, I often see this initial delay happen. I see this same behavior in the chat.html script which is included in ActiveMQ, so I'm pretty sure it's not a client-side issue.

Sometimes, while messages are coming in normally, delivery will 'stall', again for about 25 seconds. After this time has elapsed, all the missing messages are delivered at once. In other words, I can get messages 1-10 normally at a rate of approximately 1/second. Then message #11 will fail to appear. After 25 seconds, messages #11-#36 appear nearly simultaneously. After than, delivery returns to the normal 1/second rate.

Here's an example of what a 'stall' looks like. The 'sent' and 'recd' times are in seconds since the page loaded. Times are all calculated in javascript, so the same clock is in use for both. 'in-transit' is just recd minus sent. Delivery is normal up to message 19, then messages 20-44 are delayed, then normal delivery resumes at message 45. Messages 20-44 all appear at nearly the same moment.

50  sent:49.999, recd: 50.035, in-transit: 0.036
49  sent:48.997, recd: 49.032, in-transit: 0.035
48  sent:47.999, recd: 48.038, in-transit: 0.039
47  sent:46.992, recd: 47.028, in-transit: 0.036
46  sent:45.998, recd: 46.021, in-transit: 0.023
45  sent:44.997, recd: 45.023, in-transit: 0.026
44  sent:44, recd: 44.457, in-transit: 0.457
43  sent:43, recd: 44.446, in-transit: 1.446
42  sent:42, recd: 44.435, in-transit: 2.435
41  sent:40.999, recd: 44.424, in-transit: 3.425
40  sent:39.999, recd: 44.413, in-transit: 4.414
39  sent:39, recd: 44.403, in-transit: 5.403
38  sent:38, recd: 44.393, in-transit: 6.393
37  sent:37, recd: 44.382, in-transit: 7.382
36  sent:35.994, recd: 44.372, in-transit: 8.378
35  sent:34.998, recd: 44.362, in-transit: 9.364
34  sent:34.002, recd: 44.352, in-transit: 10.35
33  sent:32.993, recd: 44.342, in-transit: 11.349
32  sent:32, recd: 44.333, in-transit: 12.333
31  sent:31, recd: 44.324, in-transit: 13.324
30  sent:29.999, recd: 44.316, in-transit: 14.317
29  sent:28.999, recd: 44.308, in-transit: 15.309
28  sent:27.999, recd: 44.3, in-transit: 16.301
27  sent:27, recd: 44.293, in-transit: 17.293
26  sent:25.998, recd: 44.286, in-transit: 18.288
25  sent:24.994, recd: 44.278, in-transit: 19.284
24  sent:23.999, recd: 44.272, in-transit: 20.273
23  sent:23, recd: 44.265, in-transit: 21.265
22  sent:21.996, recd: 44.259, in-transit: 22.263
21  sent:21, recd: 44.252, in-transit: 23.252
20  sent:19.997, recd: 44.245, in-transit: 24.248
19  sent:19.001, recd: 19.198, in-transit: 0.197
18  sent:17.995, recd: 18.028, in-transit: 0.033
17  sent:16.991, recd: 17.025, in-transit: 0.034
16  sent:16.005, recd: 16.04, in-transit: 0.035
15  sent:15.004, recd: 15.037, in-transit: 0.033
14  sent:14.01, recd: 14.04, in-transit: 0.03
13  sent:13.001, recd: 13.026, in-transit: 0.025
12  sent:12, recd: 12.027, in-transit: 0.027
11  sent:10.999, recd: 11.032, in-transit: 0.033
10  sent:9.998, recd: 10.024, in-transit: 0.026

While this 'stall' is happening, if I reload the page (either by clicking 'reload', or by focusing on the browser's address bar and hitting 'enter'), the stalled messages are immediately delivered. So, if the stall happens after message 10, then I wait 5 seconds and reload, I see messages 11-15 displayed just before the browser reloads. I'm guessing that when the client closes the open GET request which is parked on the server, that somehow causes the server to flush queued/suspended messages back to the client. Why they get queued/suspended in the first place is really the question.

thanks,
alex


Reply via email to