Серверные побочные события HTML5 (SSE)

Я работаю над реализацией SSE в веб-приложении на стеке Java с использованием сервлетов. В настоящее время я столкнулся с двумя ключевыми проблемами. Позвольте мне сначала разместить мой код как для веб-страницы, так и для сервлета, а затем проблему, с которой я столкнулся.

Код веб-страницы:

<script type="text/javascript">
function registerSSE() {
var source = new EventSource("http://www.sample.com/BootStrap/NotificationServlet");
source.addEventListener('StartProductionRun', function(e) {
    // Get the data and identify the instrument Name/Id
    var dataReceived = e.data;
    document.getElementById(dataReceived + "_button").disabled = true;
    }, false);
}

function StartProduction(instrument) {
var dataString = 'instrumentName='+ instrument; 

// call ajax to submit the form and start the production  run
$.ajax({
    type: 'POST',
    url: 'http://localhost:8080/BootStrap/ProductionRunServlet',
    data: dataString,
    success: function() {
        $('#Status').html("<div id='message'></div>"); 
        $('#message').html("<h4 aling=\"centre\">Prudction Run for Instrument " + instrument  + " initiated.</h4>")
        .hide()
        .fadeIn(5000);
    }
});
}

</script>

Код сервлета:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/event-stream;charset=UTF-8");
    response.setHeader("Cache-Control", "no-cache");

    PrintWriter out = response.getWriter();
    NotificationService notificationService = null;

    while (true) {
        notificationService = NotificationService.getInstance();

        if (notificationService.getNotificationCount() > 0 ) {

            String notificationValue = notificationService.getNotification(0);
            String[] keyValue = notificationValue.split(":");

            out.print("event:" + keyValue[0] + "\n");
            out.print("data: " + keyValue[1] + "\n");
            out.print("retry:" + 1000 + "\n\n");

            out.flush();
        }
        else {
            out.print(": time stream \n");
            out.print("retry:" + 1000 + "\n\n");
            out.flush();
        }

       try {
             Thread.sleep(1000);
            } catch (InterruptedException e) {
             e.printStackTrace();
            }
    }
}

Теперь вопросы:

  1. Веб-страницу будут просматривать несколько пользователей одновременно. И я хочу, чтобы данные передавались всем пользователям, которые просматривают эту страницу. В настоящее время, когда я работаю локально на своем компьютере, даже если я открываю Chrome и Firefox, я не получаю уведомления в обоих браузерах. Он приходит только в одном.
  2. Кроме того, если я оставлю браузер запущенным на некоторое время, я обнаружу, что даже если сервлет выталкивает данные на основе определенных событий. Я не получаю уведомления в браузере.

Мне нужно убедиться, что: уведомление отправляется всем клиентам, которые просматривают эту конкретную страницу, независимо от того, что они делают на странице, или страница просто используется для просмотра информации.

С нетерпением жду всей помощи, которую я могу получить, чтобы заставить это работать. Кроме того, было бы интересно узнать, есть ли другие альтернативы, которые я могу использовать.


person Anshuman Nanda    schedule 20.09.2013    source источник


Ответы (2)


Ваш код сервлета работает отлично, хотя я не так много работал над ним (когда-то делал проект jsp). Я думаю, вы что-то пропустили в javascript? Я думаю, что в javascript также должен быть таймер/поток/цикл, чтобы непрерывно получать все данные. то есть,

setInterval(
function(){
// code which needs to run every 5sec
},5000);

Надеюсь, это немного поможет.

person Ali Nawaz Hiraj    schedule 27.12.2013

Вы должны проверить, доступен ли EventSource в этом браузере, прежде чем использовать его. Возможно, один из браузеров не поддерживает его.

person kurco19    schedule 27.01.2014