我成功地做了一个简单的小例子,它集成了 Spring MVC 和 Atmosphere 框架。它工作得很好,但它的行为方式我无法理解:
在我的尝试示例中,我尝试Date
每 10 秒广播一次字符串,所以如果我在 10:10:20 启动我的应用程序,下一条消息将是 10:10:30 等....
但在这段时间内我有 4 个回调,所以我的消息流如下所示:10:10:20、10:10:21、10:10:22、10:24、10:10:30。此行为在相同的时间段内按顺序发生:
为什么我在 10 秒内有 4 次回调,而不是每 10 秒一次?
我的相关代码是:
@RequestMapping(value="/websockets", method=RequestMethod.GET)
@ResponseBody
public void websockets(final AtmosphereResource<HttpServletRequest,HttpServletResponse> event) {
final HttpServletRequest req = event.getRequest();
final HttpServletResponse res = event.getResponse();
event.suspend();
final Broadcaster bc = event.getBroadcaster();
bc.scheduleFixedBroadcast(new Callable<String>() {
public String call() throws Exception {
return (new Date()).toString();
}
}, 10, TimeUnit.SECONDS);
}
在我的客户端代码上,我正在执行以下操作:
<script type="text/javascript">
$(document).ready(function() {
var callbackAdded = false;
function callback(response)
{
$.atmosphere.log('info', ["response.state: " + response.state]);
$.atmosphere.log('info', ["response.transport: " + response.transport]);
if (response.transport != 'polling' && response.state != 'connected' && response.state != 'closed') {
$.atmosphere.log('info', ["response.responseBody: " + response.responseBody]);
if (response.status == 200) {
var data = response.responseBody;
if (data) {
$("#date").text(data);
}
}
}
}
$.atmosphere.subscribe("websockets",
!callbackAdded? callback : null,
$.atmosphere.request = {transport: 'websocket'});
connectedEndpoint = $.atmosphere.response;
callbackAdded = true;
});
</script>