实现代码:

项目调用的接口存在访问速率限制,为防止无意义的消耗,用此代码限制本地调用速率。

package com.adc.da.jydata.util;

import com.adc.da.util.exception.AdcDaBaseException;
import com.google.common.util.concurrent.RateLimiter;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TestRateLimiter {
    private static final RateLimiter rateLimiter = RateLimiter.create(150.0 / 60); // 设置速率为150次/分钟

    public static String goEpcByCode(String apiCode) {
        System.out.println("请求接口:goEpcByCode");
        String returnData = null;
        try {
            // 获取速率限制许可,阻塞直到获得允许
            rateLimiter.acquire();
            returnData = getData(apiCode);
            System.out.println(returnData);
        } catch (Exception e) {
            System.out.println("接口" + apiCode + "调用出现异常,信息为:" + e.getMessage());
        }
        return returnData;
    }

    private static String getData(String apiCode) {
        // 打印当前时间,精确到时分秒
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = sdf.format(new Date());
        System.out.println("当前时间: " + currentTime);

        // 实际的HTTP请求逻辑
        return "";
    }

    public static void main(String[] args) {
        // 示例调用
        for(int i = 0; i < 1000; i++){
            System.out.println("第" + i + "次调用");
            goEpcByCode("test");
        }
    }
}