Повторите попытку при ошибке
У меня есть следующий метод, который использует прокси-сервер. Прокси иногда выдает ошибки, и я хочу, чтобы метод повторил попытку ошибки прокси. Я попытался сделать это с помощью библиотеки jcabi-aspect, но, похоже, она не выполняет то, что должна. Я не вижу подробных сообщений о сбоях. Любая помощь для достижения этого приветствуется.
@RetryOnFailure(attempts = 2, verbose = true)
public String update(String lastActivityDate)
{
StringBuffer response = new StringBuffer();
try
{
String url = "https://api.somesite.com/updates";
URL urlObj = new URL(url);
HttpsURLConnection con = null;
if (useProxy)
{
myapp.Proxy proxyCustom = getRandomProxy();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyCustom.getProxyIp(), proxyCustom.getProxyPort()));
con = (HttpsURLConnection) urlObj.openConnection(proxy);
}
else
{
con = (HttpsURLConnection) urlObj.openConnection();
}
// add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
con.setRequestProperty("host", urlObj.getHost());
con.setRequestProperty("Connection", "Keep-Alive");
String urlParameters = "{}";
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
// System.out.println("\nSending 'POST' request to URL : " + url);
// System.out.println("Post parameters : " + urlParameters);
// System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
response.append(inputLine);
}
in.close();
// print result
// System.out.println(response.toString());
}
catch (Exception e)
{
e.printStackTrace();
}
return response.toString();
}
1 ответ
Это происходит потому, что вы не должны пытаться использовать метод catch. Эта аннотация: @RetryOnFailure(attempts = 2, verbose = true)
выполнит ваш метод, если он выбрасывает исключение. Однако вы инкапсулируете весь код в try catch
блок.
Глядя на документацию:
Аннотируйте ваши методы аннотацией @RetryOnFailure, и, в случае исключения в методе, его выполнение будет повторяться несколько раз:
Также вы можете добавить задержку между попытками: @RetryOnFailure(attempts = 2, delay = 2000, verbose = true)
(по умолчанию в мсекундах)
РЕДАКТИРОВАТЬ: если вы не хотите настраивать его для работы с jcabi, то вы можете сделать что-то вроде этого:
int retries = 0;
Boolean success = false;
while(retries <x && ! success){ // you need to set x depending on how many retries you want
try{
// your code goes here
success = true;
}
catch{
retries++;
}
}