2016-09-20 2 views
0

Wie erstellt man Ereignisquelle Server mit Spring-Boot-Anwendung? Von dem folgenden Link sehe ich kein Java-Spring-Boot-Beispiel. Jede Referenz würde helfen.Wie erstelle ich einen Event-Source-Server mit Spring Boot?

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

+0

Mögliches Duplikat [SSE Implementierung im Frühjahr REST] (http://stackoverflow.com/questions/31229015/sse-implementation-in-spring-rest) – kaliatech

+1

Es gab keine Feder Boot-Lösung in diesem Link. Es sagt, dass es derzeit keine Unterstützung gibt. So würde bitten, diese Frage zu verlassen. – Anand

Antwort

1

Dies ist eine einfache Implementierung mit Feder 4.2. Nehmen Sie nicht die Berücksichtigung der Faden, dann ist es nur zu Demonstrationszwecken:

@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

Ich muss den Benachrichtigungszähler senden. Nur eine ganze Zahl. Wenn ich den gesamten Threadblock durch "emitter.send (notificationCount)" ersetze; Wie oft wird dieser Code ausgeführt? Was ich nicht verstehe, ist, wie man unendlich streamt, bis die Browsersitzung des Benutzers aktiv ist. Sollte ich eine while-Schleife halten, um die Sitzung des Benutzers zu überprüfen und in der Schleife zu schlafen? – Anand

+2

Wenn Sie den Thread entfernen, wird nur ein Ereignis gesendet. Deshalb müssen Sie einen Thread ausführen, bis Sie möchten. Als eine sauberere Alternative können Sie einen ExecutorService verwenden, um den Task zu starten, der die Nachrichten zu send() sendet, wenn Sie möchten. – codependent

+1

Um die Dinge ein bisschen mehr zu klären: Sie müssen nicht überprüfen, ob der Browser aktiv ist. 'emitter.send()' wird eine 'IOException' (' ClientAbortException' in Tomcat) auslösen, die signalisiert, dass der Client nicht mehr da ist. Ich habe die Antwort aktualisiert. – codependent

0

Ich habe mit dem folgenden Code versucht, neu geschrieben von @codependent ‚s Lösung mein Bedürfnis gerecht zu werden. Es reagiert. Beenden Sie die Verbindung jedoch niemals, wenn die Browser-Registerkarte geschlossen wird. Es läuft auf der Serverseite. Alles was mit HTTP GET hier zu tun ist?

@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

Es sieht OK aus. Sehen Sie sich mein Beispielprojekt an: https://github.com/codependent/spring4-sse Der Endpunkt ist/accounts/alerts. Wenn ich den Browser schließe, wird die Ausnahme ausgelöst. – codependent

+1

@codependent Das Problem wurde gefunden. Es ist nicht mit dem Code .. aber mit der Firewall, die wartet, bis die Verbindung geschlossen wird, bevor es die Daten freigibt und Verbindung öffnet Ereignis ausgelöst wird (Nur nachdem die Verbindung auf der Serverseite geschlossen ist, 'Onopen' Ereignis ausgelöst wird und "OnMessage" wird für alle Nachrichten in einem Rutsch ausgelöst. Danke für die Hilfe. Jetzt auf der Suche nach Optionen für diese :(http://Stackoverflow.com/a/13135995/1057093 – Anand

+0

Ich bin froh, dass Sie herausgefunden haben. Viel Glück ! – codependent

Verwandte Themen