基本上我有简单的新闻应用程序,现在我想让所有用户自动更新新闻列表,只要有人添加或删除新闻,它有点工作但有时我得到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 :(得分:0)
您使用arraylist来编写数据并获得数据。 ArrayList将失败。您需要一个管理concurent访问的List实现:
无论如何,像这样拉动真的很危险 - 你会遇到网络超时,你也会用很多线程循环杀死你的服务器,而真正的(在你的代码上没有等待!)。
更好的方法是使用ServerSideEvent(SSE)和事件系统。
这是一篇关于使用spring https://golb.hplar.ch/p/Server-Sent-Events-with-Spring
执行此操作的帖子它管理一个事件系统,使监听器和生产者完全分离。