Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3a87ca8

Browse files
committed
[2.1.0-SNAPSHOT]
EtherScanAPI.Builder#withRetryOnLimitReach added
1 parent3b1af9d commit3a87ca8

33 files changed

+242
-175
lines changed

‎gradle.properties‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
groupId=com.github.goodforgod
22
artifactId=java-etherscan-api
3-
artifactVersion=2.0.0
3+
artifactVersion=2.1.0-SNAPSHOT
44

55

66
##### GRADLE #####

‎src/main/java/io/goodforgod/api/etherscan/AccountAPIProvider.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ final class AccountAPIProvider extends BasicProvider implements AccountAPI {
5050
AccountAPIProvider(RequestQueueManagerrequestQueueManager,
5151
StringbaseUrl,
5252
EthHttpClientexecutor,
53-
Converterconverter) {
54-
super(requestQueueManager,"account",baseUrl,executor,converter);
53+
Converterconverter,
54+
intretryCount) {
55+
super(requestQueueManager,"account",baseUrl,executor,converter,retryCount);
5556
}
5657

5758
@NotNull

‎src/main/java/io/goodforgod/api/etherscan/BasicProvider.java‎

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,23 @@ abstract class BasicProvider {
3030
privatefinalEthHttpClientexecutor;
3131
privatefinalRequestQueueManagerqueue;
3232
privatefinalConverterconverter;
33+
privatefinalintretryCountLimit;
3334

3435
BasicProvider(RequestQueueManagerrequestQueueManager,
3536
Stringmodule,
3637
StringbaseUrl,
3738
EthHttpClientethHttpClient,
38-
Converterconverter) {
39+
Converterconverter,
40+
intretryCountLimit) {
3941
this.queue =requestQueueManager;
4042
this.module ="&module=" +module;
4143
this.baseUrl =baseUrl;
4244
this.executor =ethHttpClient;
4345
this.converter =converter;
46+
this.retryCountLimit =retryCountLimit;
4447
}
4548

46-
<T>Tconvert(byte[]json,Class<T>tClass) {
49+
private<T>Tconvert(byte[]json,Class<T>tClass) {
4750
try {
4851
finalTt =converter.fromJson(json,tClass);
4952
if (tinstanceofStringResponseTO && ((StringResponseTO)t).getResult().startsWith(MAX_RATE_LIMIT_REACHED)) {
@@ -66,23 +69,59 @@ <T> T convert(byte[] json, Class<T> tClass) {
6669
}
6770
}
6871

69-
byte[]getRequest(StringurlParameters) {
72+
privatebyte[]getRequest(StringurlParameters) {
7073
queue.takeTurn();
7174
finalURIuri =URI.create(baseUrl +module +urlParameters);
7275
returnexecutor.get(uri);
7376
}
7477

75-
byte[]postRequest(StringurlParameters,StringdataToPost) {
78+
privatebyte[]postRequest(StringurlParameters,StringdataToPost) {
7679
queue.takeTurn();
7780
finalURIuri =URI.create(baseUrl +module +urlParameters);
7881
returnexecutor.post(uri,dataToPost.getBytes(StandardCharsets.UTF_8));
7982
}
8083

8184
<T>TgetRequest(StringurlParameters,Class<T>tClass) {
82-
returnconvert(getRequest(urlParameters),tClass);
85+
returngetRequest(urlParameters,tClass,0);
86+
}
87+
88+
private <T>TgetRequest(StringurlParameters,Class<T>tClass,intretryCount) {
89+
try {
90+
returnconvert(getRequest(urlParameters),tClass);
91+
}catch (Exceptione) {
92+
if (retryCount <retryCountLimit) {
93+
try {
94+
Thread.sleep(1150);
95+
}catch (InterruptedExceptionex) {
96+
thrownewIllegalStateException(ex);
97+
}
98+
99+
returngetRequest(urlParameters,tClass,retryCount +1);
100+
}else {
101+
throwe;
102+
}
103+
}
83104
}
84105

85106
<T>TpostRequest(StringurlParameters,StringdataToPost,Class<T>tClass) {
86-
returnconvert(postRequest(urlParameters,dataToPost),tClass);
107+
returnpostRequest(urlParameters,dataToPost,tClass,0);
108+
}
109+
110+
private <T>TpostRequest(StringurlParameters,StringdataToPost,Class<T>tClass,intretryCount) {
111+
try {
112+
returnconvert(postRequest(urlParameters,dataToPost),tClass);
113+
}catch (EtherScanRateLimitExceptione) {
114+
if (retryCount <retryCountLimit) {
115+
try {
116+
Thread.sleep(1150);
117+
}catch (InterruptedExceptionex) {
118+
thrownewIllegalStateException(ex);
119+
}
120+
121+
returnpostRequest(urlParameters,dataToPost,tClass,retryCount +1);
122+
}else {
123+
throwe;
124+
}
125+
}
87126
}
88127
}

‎src/main/java/io/goodforgod/api/etherscan/BlockAPIProvider.java‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,17 @@ final class BlockAPIProvider extends BasicProvider implements BlockAPI {
2626
BlockAPIProvider(RequestQueueManagerrequestQueueManager,
2727
StringbaseUrl,
2828
EthHttpClientexecutor,
29-
Converterconverter) {
30-
super(requestQueueManager,"block",baseUrl,executor,converter);
29+
Converterconverter,
30+
intretryCount) {
31+
super(requestQueueManager,"block",baseUrl,executor,converter,retryCount);
3132
}
3233

3334
@NotNull
3435
@Override
3536
publicOptional<BlockUncle>uncles(longblockNumber)throwsEtherScanException {
3637
finalStringurlParam =ACT_BLOCK_PARAM +BLOCKNO_PARAM +blockNumber;
37-
finalbyte[]response =getRequest(urlParam);
38-
if (response.length ==0) {
39-
returnOptional.empty();
40-
}
41-
4238
try {
43-
finalUncleBlockResponseTOresponseTO =convert(response,UncleBlockResponseTO.class);
39+
finalUncleBlockResponseTOresponseTO =getRequest(urlParam,UncleBlockResponseTO.class);
4440
if (responseTO.getMessage().startsWith("NOTOK")) {
4541
returnOptional.empty();
4642
}

‎src/main/java/io/goodforgod/api/etherscan/ContractAPIProvider.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ final class ContractAPIProvider extends BasicProvider implements ContractAPI {
3535
ContractAPIProvider(RequestQueueManagerrequestQueueManager,
3636
StringbaseUrl,
3737
EthHttpClientexecutor,
38-
Converterconverter) {
39-
super(requestQueueManager,"contract",baseUrl,executor,converter);
38+
Converterconverter,
39+
intretryCount) {
40+
super(requestQueueManager,"contract",baseUrl,executor,converter,retryCount);
4041
}
4142

4243
@NotNull

‎src/main/java/io/goodforgod/api/etherscan/EthScanAPIBuilder.java‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ final class EthScanAPIBuilder implements EtherScanAPI.Builder {
2626

2727
privatefinalGsongson =newGsonConfiguration().builder().create();
2828

29+
privateintretryCountOnLimitReach =0;
2930
privateStringapiKey =DEFAULT_KEY;
3031
privateRequestQueueManagerqueueManager;
3132
privateEthNetworkethNetwork =EthNetworks.MAINNET;
@@ -87,6 +88,16 @@ public EtherScanAPI.Builder withConverter(@NotNull Supplier<Converter> converter
8788
returnthis;
8889
}
8990

91+
@NotNull
92+
publicEtherScanAPI.BuilderwithRetryOnLimitReach(intmaxRetryCount) {
93+
if (maxRetryCount <0 ||maxRetryCount >20) {
94+
thrownewIllegalStateException("maxRetryCount value must be in range from 0 to 20, but was: " +maxRetryCount);
95+
}
96+
97+
this.retryCountOnLimitReach =maxRetryCount;
98+
returnthis;
99+
}
100+
90101
@Override
91102
public@NotNullEtherScanAPIbuild() {
92103
RequestQueueManagerrequestQueueManager;
@@ -99,6 +110,6 @@ public EtherScanAPI.Builder withConverter(@NotNull Supplier<Converter> converter
99110
}
100111

101112
returnnewEtherScanAPIProvider(apiKey,ethNetwork,requestQueueManager,ethHttpClientSupplier.get(),
102-
converterSupplier.get());
113+
converterSupplier.get(),retryCountOnLimitReach);
103114
}
104115
}

‎src/main/java/io/goodforgod/api/etherscan/EtherScanAPI.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
packageio.goodforgod.api.etherscan;
22

3+
importio.goodforgod.api.etherscan.error.EtherScanRateLimitException;
34
importio.goodforgod.api.etherscan.http.EthHttpClient;
45
importio.goodforgod.api.etherscan.manager.RequestQueueManager;
56
importjava.util.function.Supplier;
67
importorg.jetbrains.annotations.NotNull;
8+
importorg.jetbrains.annotations.Range;
79

810
/**
911
* EtherScan full API Description <a href="https://etherscan.io/apis">...</a>
@@ -62,6 +64,15 @@ interface Builder {
6264
@NotNull
6365
BuilderwithConverter(@NotNullSupplier<Converter>converterSupplier);
6466

67+
/**
68+
* By default is disabled
69+
*
70+
* @param maxRetryCount to retry if {@link EtherScanRateLimitException} thrown
71+
* @return self
72+
*/
73+
@NotNull
74+
EtherScanAPI.BuilderwithRetryOnLimitReach(@Range(from =0,to =20)intmaxRetryCount);
75+
6576
@NotNull
6677
EtherScanAPIbuild();
6778
}

‎src/main/java/io/goodforgod/api/etherscan/EtherScanAPIProvider.java‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,20 @@ final class EtherScanAPIProvider implements EtherScanAPI {
2626
EthNetworknetwork,
2727
RequestQueueManagerqueue,
2828
EthHttpClientethHttpClient,
29-
Converterconverter) {
29+
Converterconverter,
30+
intretryCount) {
3031
// EtherScan 1request\5sec limit support by queue manager
3132
finalStringbaseUrl =network.domain() +"?apikey=" +apiKey;
3233

3334
this.requestQueueManager =queue;
34-
this.account =newAccountAPIProvider(queue,baseUrl,ethHttpClient,converter);
35-
this.block =newBlockAPIProvider(queue,baseUrl,ethHttpClient,converter);
36-
this.contract =newContractAPIProvider(queue,baseUrl,ethHttpClient,converter);
37-
this.logs =newLogsAPIProvider(queue,baseUrl,ethHttpClient,converter);
38-
this.proxy =newProxyAPIProvider(queue,baseUrl,ethHttpClient,converter);
39-
this.stats =newStatisticAPIProvider(queue,baseUrl,ethHttpClient,converter);
40-
this.txs =newTransactionAPIProvider(queue,baseUrl,ethHttpClient,converter);
41-
this.gasTracker =newGasTrackerAPIProvider(queue,baseUrl,ethHttpClient,converter);
35+
this.account =newAccountAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
36+
this.block =newBlockAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
37+
this.contract =newContractAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
38+
this.logs =newLogsAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
39+
this.proxy =newProxyAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
40+
this.stats =newStatisticAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
41+
this.txs =newTransactionAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
42+
this.gasTracker =newGasTrackerAPIProvider(queue,baseUrl,ethHttpClient,converter,retryCount);
4243
}
4344

4445
@NotNull

‎src/main/java/io/goodforgod/api/etherscan/GasTrackerAPIProvider.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ final class GasTrackerAPIProvider extends BasicProvider implements GasTrackerAPI
2828
GasTrackerAPIProvider(RequestQueueManagerqueue,
2929
StringbaseUrl,
3030
EthHttpClientethHttpClient,
31-
Converterconverter) {
32-
super(queue,"gastracker",baseUrl,ethHttpClient,converter);
31+
Converterconverter,
32+
intretryCount) {
33+
super(queue,"gastracker",baseUrl,ethHttpClient,converter,retryCount);
3334
}
3435

3536
@Override

‎src/main/java/io/goodforgod/api/etherscan/LogsAPIProvider.java‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ final class LogsAPIProvider extends BasicProvider implements LogsAPI {
2525
LogsAPIProvider(RequestQueueManagerqueue,
2626
StringbaseUrl,
2727
EthHttpClientexecutor,
28-
Converterconverter) {
29-
super(queue,"logs",baseUrl,executor,converter);
28+
Converterconverter,
29+
intretryCount) {
30+
super(queue,"logs",baseUrl,executor,converter,retryCount);
3031
}
3132

3233
@NotNull

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp