Java OkHttp使用(二)

文章目录

    • 引言
    • [使用 OkHttp 发送回调](#使用 OkHttp 发送回调)
    • 其他

引言

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

使用 OkHttp 发送回调

java 复制代码
/**
 * 回调重试类
 */
@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;
    }
}
java 复制代码
/**
 * 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() {
            @Override
            public void onFailure(Call call, IOException e) {
                log.error("[回调失败][call:{}]", e.getMessage());
                // 回调次数+1
                retryData.setTime(retryData.getTime() + 1);
                // 放入验证队列
                VERIFY_QUEUE.offer(retryData);
            }

            @Override
            public 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);
                    // 回调次数+1
                    retryData.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使用

相关推荐
予枫的编程笔记2 分钟前
【面试专栏|Java并发编程】从Runnable到Callable,Java4种线程创建方式
java·多线程·thread·java面试·runnable·callable·java线程
野犬寒鸦5 分钟前
SAP后端实习开发面试:操作系统与网络核心考点及Linux与Redis
java·服务器·网络·后端·面试
ServBay7 分钟前
代码减半,10分钟彻底告别 Java 开发旧习
java·后端
MegaDataFlowers17 分钟前
CRUD操作及配置解析
java·mybatis
毕设源码-邱学长23 分钟前
【开题答辩全过程】以 胡小楼行政村农用灌溉机井预约管理系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
JTCC26 分钟前
Java 设计模式西游篇 - 第五回:装饰者模式添法力 悟空披挂新战袍
java·观察者模式·设计模式
xiaoye370838 分钟前
哪些因素会影响Spring Bean的线程安全?
java·spring
荔枝要好学41 分钟前
一个jar包通过java -jar 指令找不到启动类,那么我是否可以通过java -cp命令指定启动类的方式启动?
java
java1234_小锋1 小时前
Java高频面试题:Mysql里where1=1会不会影响性能?
java·开发语言
qq_12498707531 小时前
基于springboot的微信小程序的博物馆文创系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·spring·微信小程序·毕业设计·计算机毕设