2017-07-29 4 views
1

Grundsätzlich habe ich einfache Nachrichten App, jetzt möchte ich News-Liste automatisch für alle Benutzer aktualisiert werden, wenn jemand fügt hinzu oder entfernt Nachrichten, es funktioniert irgendwie, aber manchmal bekomme ich ConcurrentModificationException, ich brauche nur Hilfe beim Schreiben dieser Methode :Frühling lang polling ConcurrentModificationException

@GetMapping("/pollnews") 
@ResponseBody 
public DeferredResult<ModelAndView> poll(Model model){ 
    DeferredResult<ModelAndView> result = new DeferredResult<>(); 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while(true){ 
       if(changeOccured){ 
        changeOccured = false; 
        model.addAttribute("news", newsService.getAllNews()); 
        result.setResult(new ModelAndView("partial")); 
        break; 
       } 
      } 
     } 
    }).start(); 
    return result; 
} 

Stapelüberwachung:

Exception in thread "Thread-13" java.util.ConcurrentModificationException 
at java.util.ArrayList.sort(ArrayList.java:1456) 
at com.newsapp.SpringNews.Service.NewsService.getAllNews(NewsService.java:25) 
at com.newsapp.SpringNews.Controller.ViewController$1.run(ViewController.java:125) 
at java.lang.Thread.run(Thread.java:748) 
+0

Sie geben an, in welcher Zeile die Ausnahme auftritt? – Lino

+0

Es tritt in der NewsService-Klasse und getAllnews() -Methode, aber es spielt keine Rolle, da ich denke, dass ich diese Poll() -Methode falsch geschrieben und Problem ist wahrscheinlich dort ... –

+0

können Sie den Stack-Trace zu Ihrer Frage hinzufügen? weil ich nichts falsch mit Ihrer Methode sehe – Lino

Antwort

0

Sie verwenden ein Arraylist-Daten zu schreiben und Daten concurently zu bekommen. ArrayList wird daran scheitern. Sie müssen eine Liste Implementierung, die concurent Zugriff verwalten:

Wie auch immer, wie das Ziehen ist wirklich gefährlich - Sie werden Netzwerk-Timeout treffen, werden Sie auch Sie Server mit viel Faden töten, auf die While true (auf Looping Dein Code gibt es keine Wartezeit!).

Ein viel besserer Ansatz wäre die Verwendung von ServerSideEvent (SSE) und Event-System.

hier ein Beitrag auf tun, dass mit Feder https://golb.hplar.ch/p/Server-Sent-Events-with-Spring

Es ein Event-System verwalten, die Zuhörer und Produzent völlig entkoppelt machen.

+0

Danke für den Vorschlag, aber ich wollte es so einfach wie möglich machen, auch denken Sie, es ist möglich, es zu refaktorieren, um es besser und funktioniert? –

+0

Bearbeitet, um das Problem mit concurent hinzuzufügen. – wargre

Verwandte Themen