2016-09-20 3 views
0

Как создать сервер событий с использованием весеннего загрузочного приложения? Из приведенной ниже ссылки я не вижу пример загрузки Java-spring. Любая ссылка поможет.Как создать сервер источника событий с помощью Spring загрузки?

http://www.html5rocks.com/en/tutorials/eventsource/basics/

+0

Возможный дубликат [внедрения SSE в Spring REST] (http://stackoverflow.com/questions/31229015/sse-implementation-in-spring-rest) – kaliatech

+1

Там не было пружинный загрузочный раствор в этой ссылке. В нем говорится, что в настоящее время нет поддержки. Так что прошу оставить этот вопрос. – Anand

ответ

1

Это простая реализация с Spring 4.2. Не принимать во внимание тему, он там только для демонстрационных целей:

@RestController 
public class AccountsRestController { 

    @RequestMapping("/accounts/alerts") 
    public SseEmitter getAccountAlertsNoPathVariable(HttpSession session) { 

     SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); 

     Thread t1 = new Thread(() ->{ 
      try { 
       int i = 0; 
       // Send 10000 messages 
       while(++i<=10000){ 
        Thread.sleep(1000); 
        System.out.println("Sending"); 
        try{ 
         emitter.send(new Alert((long)i, "Alert message"+i)); 
        }catch(ClientAbortException cae){ 
         //The client is not there anymore, we get out of the loop 
         i = 10000; 
        } 
       } 
       emitter.complete(); 
      } catch (IOException | InterruptedException e) { 
       e.printStackTrace(); 
      } 
     }); 
     t1.start(); 

     return emitter; 
    } 
+1

Мне нужно отправить счетчик уведомлений. Просто целое число. Если я заменил весь блок потока «emitter.send (notificationCount)»; как часто будет работать этот код? То, что я не получаю, - это то, как передавать поток бесконечно до тех пор, пока сеанс браузера пользователей не будет активен. Должен ли я держать цикл цикла, проверяя сеанс пользователя и спать внутри цикла? – Anand

+2

Если вы удалите нить, будет отправлено только одно событие. Вот почему вам нужен поток для запуска, пока вы не захотите. В качестве более чистой альтернативы вы можете использовать ExecutorService для запуска задачи, которая отправляет() сообщения, когда вы захотите. – codependent

+1

Чтобы еще раз прояснить ситуацию: вам не нужно проверять, активен ли браузер. 'emitter.send()' будет вызывать 'IOException' (' ClientAbortException' в Tomcat), сигнализируя, что клиента больше нет. Я обновил ответ. – codependent

0

Я попытался с ниже кодом, переписано из раствора @codependent «s, чтобы удовлетворить свою потребность. Его ответ. Но никогда не завершайте соединение, когда вкладка браузера закрывается. Его работа выполняется на стороне сервера. Все, что связано с HTTP GET здесь?

@RequestMapping(value = "/getNotificationCount/{userId}",method = RequestMethod.GET) 
    public SseEmitter getNotificationCount(@PathVariable("userId") String userId, HttpServletResponse response){ 
     SseEmitter emitter = null; 
     try { 
      emitter = new SseEmitter(); 

      while(true) { 
       try{ 
        int count= myService.getNotificationCount(Integer.parseInt(userId)); 
        emitter.send(count); 
        Thread.sleep(30 * // minutes to sleep 
           60 * // seconds to a minute 
           1000); // milliseconds to a second 

       }catch(ClientAbortException cae){ 
        LOGGER.info("ClientAbortException Breaking the notification stream"); 
        break; 
       } 
      } 

      //Closes the stream 
      emitter.complete(); 

     } catch (Exception e) { 
      //Closes the stream 
      emitter.complete(); 
     } 

     return emitter; 
    } 
+1

Все в порядке. Взгляните на мой примерный проект: https://github.com/codependent/spring4-sse Конечная точка - это учетные записи/оповещения. Когда я закрываю браузер, возникает исключение. – codependent

+1

@codependent Обнаружена проблема. Его не с кодом .. но с брандмауэром, который ждет, пока соединение не будет закрыто до того, как оно освободит данные и откроется событие открытия соединения (только после того, как соединение закрыто на стороне сервера, запускается событие onopen и «onmessage» запускается для всех сообщений за один раз. Спасибо за помощь. Теперь ищем варианты для этого :(http://stackoverflow.com/a/13135995/1057093 – Anand

+0

Я рад, что вы узнали. ! – codependent