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

JAVA定时调用API比对新旧响应,过滤查询ID存储实现咨询

需求实现方案

你需要新增一个全局的去重存储结构,用来记录已经到达终态(FINISHED/FAILED)的queryId,避免重复处理,再调整逻辑和规则对齐即可,修改步骤如下:

1. 新增类成员变量

在你的Runnable实现类中添加两个成员变量:

// 存储所有已结束的queryId,用线程安全的Set保证并发访问安全,查询效率O(1)
private final Set<String> finishedQueryIds = Collections.synchronizedSet(new HashSet<>());
// 停止标识加volatile保证多线程可见性
private volatile boolean stopRequested = false;

2. 调整核心校验逻辑

删掉原来无效的presResponse定义,将校验逻辑改为和全局终态集合比对,符合你要求的规则:

try(BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"))) {
    StringBuilder response = new StringBuilder();
    String responseLine = null;
    while ((responseLine = br.readLine()) != null) {
        response.append(responseLine.trim());
    }
    JSONArray array = new JSONArray(response.toString());

    for(int i=0; i < array.length(); i++) {
        JSONObject object = array.getJSONObject(i);
        String queryId = object.getString("queryId");
        String state = object.getString("state");

        // 已到达终态的query直接跳过
        if (finishedQueryIds.contains(queryId)) {
            continue;
        }

        if ("RUNNING".equals(state)) {
            // 匹配到新增运行中query,按需求输出/存储即可
            String strResponse = String.format("{\"queryId\":\"%s\",\"state\":\"%s\"}", queryId, state);
            System.out.println(strResponse);
        } else if ("FINISHED".equals(state) || "FAILED".equals(state)) {
            // 终态query加入去重集合,后续不再处理
            finishedQueryIds.add(queryId);
        }
    }
}

3. 可选优化点

  • 把SSL配置、Authenticator设置移到while循环外面,不需要每次请求都重复设置
  • 可以给finishedQueryIds增加定期清理逻辑,比如定时删除超过7天的终态queryId,避免长时间运行内存溢出
  • 如果对定时精度要求更高,可以用ScheduledExecutorService替代Thread.sleep实现调度,可控性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:21:01