私のサービスへのHttpコールを行うライブラリで作業しています。サービスマシンが応答しない場合(ソケットタイムアウトや接続タイムアウトがあります)、私は私のローカルblockList
にそれらを追加し、マシンが5回ブロックされている場合、私はそれらに電話をかけません。特定の時間間隔の間、眼鏡のマシンをブロックする
それでは、machineA
は(throwing RestClientException)
が応答しない場合、私はmachineA
そうであれば、閾値としてonFailure
方法毎回を呼び出し、カウンタをインクリメント維持し、その後再びmachineA
への呼び出しをしながら、私はホスト名としてmachineA
を渡すことでisBlocked
方法をチェックして、5になるとしましょう5回ブロックされてしまったので、私は彼らに電話をしません。私のライブラリはマルチスレッドなので、すべてのスレッドに同じ値を見せたいので、ここではvolatileを使用しています。以下は
は、私がDataMapping
クラスに持っているものです。
public static volatile ConcurrentHashMap<String, AtomicInteger> blockedHosts =
new ConcurrentHashMap<String, AtomicInteger>();
boolean isBlocked(String hostname, int threshold) {
AtomicInteger count = blockedHosts.get(hostname);
return count != null && count.get() >= threshold;
}
void onFailure(String hostname) {
AtomicInteger newValue = new AtomicInteger();
AtomicInteger val = blockedHosts.putIfAbsent(hostname, newValue);
// no need to care about over-reaching 5 here
(val == null ? newValue : val).incrementAndGet();
}
void onSuccess(String hostname) {
blockedHosts.remove(hostname);
}
問題文: -
今私はある1つの以上の機能を追加したい - machineA
がブロックされている場合(そのブロック・カウントので、 > = 5)、私はそれをx間隔でブロックしておきたいと思います。私は別のパラメータ(key.getInterval())
を持っています。このマシンはブロックされたままにしておきたい時間を教えてくれるでしょう。そして、そのインターバルが経過した後、私は彼らに電話をかけ始めます。この機能を追加する方法を理解できません。
以下は、私がDataMapping
メソッドを使用してホスト名がブロックされているかどうかをチェックし、ホスト名をブロックするための主なスレッドコードです。
@Override
public DataResponse call() {
ResponseEntity<String> response = null;
List<String> hostnames = some_code_here;
for (String hostname : hostnames) {
// If hostname is in block list, skip sending request to this host
if (DataMapping.isBlocked(hostname)) {
continue;
}
try {
String url = createURL(hostname);
response = restTemplate.exchange(url, HttpMethod.GET, key.getEntity(), String.class);
DataMapping.onSuccess(hostname);
// some code here to return the response if successful
} catch (RestClientException ex) {
// adding to block list
DataMapping.onFailure(hostname);
}
}
return new DataResponse(DataErrorEnum.SERVER_UNAVAILABLE, DataStatusEnum.ERROR);
}
私は特定の期間のために特定のマシンをブロックし、その間隔が経過するとすぐにその後、それらだけに通話を発信し始めることができますどのように
?
あなたはそれが間隔が経過した場合、それがブロックされているだけではなく、かどうかを、伝えるためにブロックさになったときを追跡する必要があります。 –