SpringMVCとAtmosphereフレームワークを統合したシンプルで小さな例を作成することに成功しました。それは非常にうまく機能しますが、私が理解していないように動作します:
私のtryの例ではDate
、10秒ごとに文字列をブロードカストしようとしているので、アプリを10:10:20に起動すると、次のメッセージは10:10:30などになります。
しかし、その代わりに、この期間内に4つのコールバックがあるため、メッセージフローは次のようになります:10:10:20、10:10:21、10:10:22、10:24、10:10:30。この動作は、同じ時間帯で順番に発生します。
10秒ごとに1回ではなく、10秒で4回のコールバックがあるのはなぜですか?
私の関連するコードは次のとおりです。
@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>