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
相关产品推荐
相关产品推荐

