Spring长轮询ConcurrentModificationException

时间:2017-07-29 13:17:18

标签: java ajax spring concurrency long-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;
}

堆栈追踪:

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)

1 个答案:

答案 0 :(得分:0)

您使用arraylist来编写数据并获得数据。 ArrayList将失败。您需要一个管理concurent访问的List实现:

无论如何,像这样拉动真的很危险 - 你会遇到网络超时,你也会用很多线程循环杀死你的服务器,而真正的(在你的代码上没有等待!)。

更好的方法是使用ServerSideEvent(SSE)和事件系统。

这是一篇关于使用spring https://golb.hplar.ch/p/Server-Sent-Events-with-Spring

执行此操作的帖子

它管理一个事件系统,使监听器和生产者完全分离。