Мне удалось сделать простой и небольшой пример, который интегрируется между 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. Такое поведение происходит последовательно с тем же периодом времени:
Почему у меня 4 обратных вызова за 10 секунд вместо одного каждые 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>