HTTPBuilder如何实现响应码为202时重试直到返回200状态码
实现方案
核心逻辑是把单次HTTP请求包裹在循环结构中,仅当收到200状态码拿到有效游戏数据时才跳出循环返回结果;收到202响应时等待固定间隔后重新发起请求,同时增加最大重试限制避免死循环。
改造后可直接使用的代码
import java.util.concurrent.TimeUnit def get_Game(String gameId, long retryIntervalMs = 1000, int maxRetries = 30) { def gameInfo = null int retryCount = 0 while (gameInfo == null) { // 达到最大重试次数直接抛出异常,避免永久阻塞 if (retryCount >= maxRetries) { throw new RuntimeException("获取游戏信息失败,连续${maxRetries}次请求均返回排队中状态") } http.request(Method.GET, ContentType.XML) { uri.path = gamePath uri.query = [id: gameId] // 200响应:读取结果赋值,触发循环退出 response.'200' = { resp, reader -> gameInfo = reader.item } // 202响应:计数+1,不赋值gameInfo,后续进入重试等待 response.'202' = { println "请求已进入排队,${retryIntervalMs}ms后进行第${retryCount + 1}次重试" retryCount++ } // 其他异常状态码直接抛错,不做重试 response.failure = { resp -> throw new RuntimeException("接口请求异常,状态码:${resp.status}") } } // 未拿到有效结果则等待间隔时间,再进入下一轮请求 if (gameInfo == null) { TimeUnit.MILLISECONDS.sleep(retryIntervalMs) } } return gameInfo }
调参说明
retryIntervalMs:重试间隔,单位毫秒,建议从1000ms(1秒)起步,根据业务接口实际排队耗时调整,不要设置过短避免高频请求压垮服务端maxRetries:最大重试次数,和重试间隔配合控制最长等待时间,比如间隔1秒、重试30次就对应最长等待30秒,可根据业务容忍的最大等待时长调整- 如果业务不需要限制重试时长,可以去掉最大重试次数的判断,但生产环境不建议这么做,避免服务端异常时程序永久卡死
内容的提问来源于stack exchange,提问作者Marta Martínez
相关产品推荐
相关产品推荐

