You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,即可确认是多请求导致的问题。

解决方案

  1. 优化接口响应速度

    • 移除Thread.sleep(2000),Jsoup已设置20秒超时,无需额外休眠
    • 改用异步批量请求(比如CompletableFuture并行处理多个Jsoup请求,注意目标网站反爬限制),缩短总执行时间,避免触发超时重试
  2. 阻止重复请求

    • 前端:按钮点击后立即禁用,直到请求返回再恢复;确保请求逻辑只触发一次
    • 后端:给接口加幂等校验,让前端传唯一请求ID,后端先校验该ID是否已处理,避免重复执行
    • 调整超时设置:在Spring Boot中配置更长的接口超时时间,或前端请求时设置合理的超时参数
  3. 排查请求来源

    • 开启Spring Web的DEBUG日志(logging.level.org.springframework.web=DEBUG),打印所有进入的请求,查看是否有重复的URL和参数
    • 检查是否有监控脚本、爬虫或其他服务在自动调用该接口

为什么synchronized无效

给方法加synchronized只能保证同一时间只有一个线程执行该方法,但如果有多个请求过来,第一个线程执行时第二个线程会等待,等第一个执行完毕后第二个线程会从头开始执行,所以你看到的是多个请求的日志穿插输出,并非循环并行。


内容的提问来源于stack exchange,提问作者Teck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:13:30