Jsoup循环解析出现重复迭代异常问题求助
问题原因及解决方案
核心原因:重复HTTP请求触发了方法多次执行
你看到的循环“重新开始”,本质不是循环本身并行执行,而是parser方法被多次调用了。因为该方法由GET请求触发,常见的重复请求场景包括:
- 浏览器因请求超时自动重试(你的方法每次迭代休眠2秒,列表越长总执行时间越久,极易触发超时)
- 前端代码重复发送请求(比如按钮绑定了多次点击事件、异步请求逻辑有重复触发)
- 反向代理或负载均衡器的重试、健康检查机制
验证方法
在方法开头添加唯一请求标识的日志,确认是否存在多请求:
public void parser(String type, String someUrl) throws InterruptedException { String requestId = UUID.randomUUID().toString(); System.out.println("===== 新请求启动,ID:" + requestId + ",线程ID:" + Thread.currentThread().getId() + " ====="); // 原有代码逻辑... }
如果控制台输出多个不同的requestId,即可确认是多请求导致的问题。
解决方案
优化接口响应速度
- 移除
Thread.sleep(2000),Jsoup已设置20秒超时,无需额外休眠 - 改用异步批量请求(比如
CompletableFuture并行处理多个Jsoup请求,注意目标网站反爬限制),缩短总执行时间,避免触发超时重试
- 移除
阻止重复请求
- 前端:按钮点击后立即禁用,直到请求返回再恢复;确保请求逻辑只触发一次
- 后端:给接口加幂等校验,让前端传唯一请求ID,后端先校验该ID是否已处理,避免重复执行
- 调整超时设置:在Spring Boot中配置更长的接口超时时间,或前端请求时设置合理的超时参数
排查请求来源
- 开启Spring Web的DEBUG日志(
logging.level.org.springframework.web=DEBUG),打印所有进入的请求,查看是否有重复的URL和参数 - 检查是否有监控脚本、爬虫或其他服务在自动调用该接口
- 开启Spring Web的DEBUG日志(
为什么synchronized无效
给方法加synchronized只能保证同一时间只有一个线程执行该方法,但如果有多个请求过来,第一个线程执行时第二个线程会等待,等第一个执行完毕后第二个线程会从头开始执行,所以你看到的是多个请求的日志穿插输出,并非循环并行。
内容的提问来源于stack exchange,提问作者Teck
相关产品推荐
相关产品推荐

