Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用动态代理处理API节流异常_Java_Amazon Web Services_Api_Throttling - Fatal编程技术网

在Java中使用动态代理处理API节流异常

在Java中使用动态代理处理API节流异常,java,amazon-web-services,api,throttling,Java,Amazon Web Services,Api,Throttling,我到处都在使用AWS SSM客户端,我很难在任何地方添加try/catch块并实现相同的自动重试机制 有什么简单的方法吗?是的!我最近在Java中发现了代理,我可以使用它代理SSM客户机中的所有方法,然后到处传递这个代理实例。以下是我的想法: private AWSSimpleSystemsManagement createClient() { final AWSSimpleSystemsManagement ssm = AWSSimpleSystemsManagementClientB

我到处都在使用AWS SSM客户端,我很难在任何地方添加try/catch块并实现相同的自动重试机制


有什么简单的方法吗?

是的!我最近在Java中发现了代理,我可以使用它代理SSM客户机中的所有方法,然后到处传递这个代理实例。以下是我的想法:

private AWSSimpleSystemsManagement createClient() {
    final AWSSimpleSystemsManagement ssm = AWSSimpleSystemsManagementClientBuilder.standard()
            ...
            ...
            .build();
    return (AWSSimpleSystemsManagement) Proxy.newProxyInstance(ssm.getClass().getClassLoader(),
            new Class[]{AWSSimpleSystemsManagement.class}, (proxy, method, args) -> {
                while (true) {
                    try {
                        return method.invoke(ssm, args);
                    } catch (Exception e) {
                        if (ExceptionUtils.getStackTrace(e).contains("Rate exceeded")
                                || e.toString().contains("Rate exceeded")) {
                            final long delay = (long) (5_000 * Math.random());
                            logger.warn("AWS is throttling us. Will retry in {} ms", delay);
                            EDUtils.sleep(delay);
                        } else {
                            throw e;
                        }
                    }
                }
            });
}
InvocationHandler和Proxy的Javadoc可在以下位置找到: