在Java中使用动态代理处理API节流异常
我到处都在使用AWS SSM客户端,我很难在任何地方添加try/catch块并实现相同的自动重试机制在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
有什么简单的方法吗?是的!我最近在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可在以下位置找到: