当前位置: 首页 > news >正文

Java OkHttp使用(二)

文章目录

    • 引言
    • 使用 OkHttp 发送回调
    • 其他

引言

记录一下 OkHttp 的使用;OkHttp 异步发送回调请求,增加回调失败重试。

使用 OkHttp 发送回调

/*** 回调重试类*/
@Data
public class CallBackRetryData {/*** 回调信息JSON*/private JSONObject bodyRequest;/*** 回调发送地址*/private String url;/*** 重试次数*/private int time;public CallBackRetryData(JSONObject bodyRequest, String url, int time) {this.bodyRequest = bodyRequest;this.url = url;this.time = time;}
}
/*** HTTP 操作类*/
@Slf4j
@Service
public class HttpService {private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient().newBuilder().connectTimeout(1, TimeUnit.MINUTES).readTimeout(1, TimeUnit.MINUTES).writeTimeout(1, TimeUnit.MINUTES).build();/*** 回调重试队列*/private final Queue<CallBackRetryData> VERIFY_QUEUE = new LinkedList<>();/*** 构造回调信息*/public void buildCallBackData() {JSONObject bodyRequest = new JSONObject();bodyRequest.put("userId", "123456789");CallBackRetryData retryData = new CallBackRetryData(bodyRequest, "https://发送回调地址", 1);sendCallBack(retryData);}/*** 异步发送回调*/public void sendCallBack(CallBackRetryData retryData) {RequestBody requestBody = RequestBody.create(retryData.getBodyRequest().toJSONString(), MediaType.parse("application/json;charset=utf-8"));Request request = new Request.Builder().url(retryData.getUrl()).post(requestBody).addHeader("content-type", "application/x-www-form-urlencoded").build();OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {log.error("[回调失败][call:{}]", e.getMessage());// 回调次数+1retryData.setTime(retryData.getTime() + 1);// 放入验证队列VERIFY_QUEUE.offer(retryData);}@Overridepublic void onResponse(Call call, Response response) throws IOException {String responseData = response.body().string();CallBackResponseData callBackData = JSONObject.parseObject(responseData, CallBackResponseData.class);if (callBackData.getCode() != 200) {log.error("[回调失败][状态码错误:{}]", callBackData);// 回调次数+1retryData.setTime(retryData.getTime() + 1);// 放入验证队列VERIFY_QUEUE.offer(retryData);}}});}/*** 每分钟检查一次*/@Scheduled(cron = "0 0/1 * * * ? ")public void execute() {// 执行超时验证队列while (VERIFY_QUEUE.size() > 0) {CallBackRetryData retryData = VERIFY_QUEUE.poll();// 重新发送if (retryData.getTime() <= 3) {try {log.info("[VERIFY_QUEUE][userId:{}][time:{}]",retryData.getBodyRequest().getString("userId"),retryData.getTime());sendBonusCallBack(retryData);} catch (Exception e) {log.error("[VERIFY_QUEUE error: {}]", e.getMessage());}}}}
}

其他

Java OkHttp使用


http://www.mrgr.cn/news/2533.html

相关文章:

  • VAuditDemo文件漏洞
  • 回溯算法——LeetCode491 递增子序列
  • 如何设计一个分布式任务调度器
  • 软件测试学习笔记丨数据查询语言DQL
  • SD-WAN安全:在灵活性与安全性之间找到平衡
  • 如何对Ajax进行进度控制
  • Ubuntu网络服务无法启动问题
  • 数据的动态舞蹈:SQL中的动态计算艺术
  • 【Linux 从基础到进阶】高可用性与负载均衡(HAProxy、Keepalived)
  • CentOS上安装和配置Docker与Docker Compose的详细指南
  • OpenCV几何图像变换(2)计算仿射变换矩阵的函数getAffineTransform()的使用
  • 成为创作者的第1024天:成长与技术积累的旅程
  • 前端面试——js作用域
  • 高性能日志系统 代理模式构建全局日志器获取接口
  • windows hook之进程防杀(任务管理器)
  • 基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像
  • linux下主机网络不通,如何进行排查?
  • Redis 作为 PHP 的会话存储
  • matlab rng函数的理解和使用
  • ip地址冲突的原因及其解决方法是什么