2017-07-29 13 views
1

基本的に私は簡単なニュースアプリを持っています。誰かがニュースを追加したり削除したりするたびに自動的にニュースリストを更新したいのですが、ちょっとだけConcurrentModificationExceptionが表示されます。 :春の長いポーリング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; 
} 

スタックトレース:

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

あなたは例外が発生する行を指定しますか? – Lino

+0

これはnewsServiceクラスとgetAllnews()メソッドで発生しますが、このpoll()メソッドを間違って記述していると思うので問題ありません。問題はおそらくそこにあります... –

+0

あなたの質問にスタックトレースを追加できますか?あなたのメソッドに間違っているとは思わないので、 – Lino

答えて

0

あなたは、データを書き込み、concurentlyデータを取得するためのArrayListを使用しています。 ArrayListは失敗します。あなたはconcurentのアクセスを管理するリストの実装が必要になります。

のような本当のconcurentリストを使用する - あなたはネットワークのタイムアウトを打つだろう、あなたはまた、上の(真の中にループ糸の多くのあなたのサーバーを殺すでしょうあなたのコードは待ちません!)。

もっと良いアプローチは、ServerSideEvent(SSE)とイベントシステムを使用することです。ここで

https://golb.hplar.ch/p/Server-Sent-Events-with-Spring

でそれがリスナーとプロデューサーが完全に分離させるイベントシステムを管理することをやって上のポスト。

+0

提案してくれてありがとうございましたが、できるだけシンプルにしたいと思っていました。 –

+0

問題を追加するために編集されました。 – wargre

関連する問題