@Retryable не работает при вызове из метода

Ниже мой класс приложения. Поток похож на класс DEToken отсюда и из DEToken я вызываю RestConnection, где у меня есть метод @retryable.

@SpringBootApplication
@EnableRetry
public class SpringBootTrfficApplication implements CommandLineRunner {

    Enter code here

    @Autowired
    DEToken deToken;

    @Autowired
    SyncService syncService;
    public static void main(String[] args) {
        SpringApplication.run(SpringBootTrfficApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        deToken.getToken();
    }
}

Класс DEToken: из getToken я звоню RestConnect, где у меня есть метод @Retrable:

@Service
public class DEToken {
    private Logger logger = LogManager.getLogger(getClass());

    @Autowired
    RestConnection restConnection;

    @Autowired
    private Environment env;

    public String accessToken;

    public void getToken() {
        System.out.println("hello from get token");
        //String getJsonPayload = "{\"Query\":{\"RegisterExtensionWithDE\":{\"pid\": \"\",\"providerInsName\":" +
        //env.getProperty("provider.ins") + "}}}";
        //String str = restConnection.restPost(
        //    env.getProperty("rest.de.url"), getJsonPayload);

        try {
            String getJsonPayload =
                "{\"Query\":{\"RegisterExtensionWithDE\":{\"pid\": \"\",\"providerInsName\":" +
                env.getProperty("provider.ins") + "}}}";
            StringBuffer tokenResult =
                restConnection.restPost(env.getProperty("rest.de.url"),
                                        getJsonPayload);
            System.out.println(tokenResult);
            JSONObject xmlJSONObj = XML.toJSONObject(tokenResult.toString());
            JSONObject registration = new JSONObject();
            if (xmlJSONObj.has("Registration")) {
                registration  = xmlJSONObj.getJSONObject("Registration");
                if (registration.has("accessToken")) {
                    accessToken = registration.get("accessToken").toString();
                }
                else
                    logger.info("no accessToken from DE");
            }
            else
                logger.info("no Registration object from DE");
        }
        catch (Exception e) {
            logger.error("Exception while fetching accesstoken from DE ");
            logger.error(e.getMessage());
        }
    }
}

Мой класс подключения REST, где у меня есть метод retryable:

@Service
public class RestConnection {

    private Logger logger = LogManager.getLogger(getClass());

    @Autowired
    private Environment env;

    public void setBaseUrl(String value, String ip) {
        //baseUrl = value;
        HttpsURLConnection.setDefaultHostnameVerifier(
            (hostname, session) -> hostname.equals(ip));
    }


    /*
     * REST post call
     */
    @Retryable(value = {IOException.class, ConnectException.class},
               maxAttempts = 4,
               backoff = @Backoff(5000))
    public StringBuffer restPost(String restUrl, String payload) {
        StringBuffer sb = new StringBuffer();
        HttpURLConnection conn = null;
        try {
            URL url = new URL(restUrl);
            String protocol = url.getProtocol();
            if (protocol.toLowerCase().equals("http")) {
                conn = (HttpURLConnection)url.openConnection();
            }
            else if (protocol.toLowerCase().equals("https")) {
                //setTrustedCert();
                conn = (HttpsURLConnection)url.openConnection();
            }
            else {
                logger.info("Protocol is neither HTTP nor HTTPS");
            }
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("version", env.getProperty("de.version"));
            conn.setRequestProperty("accessToken", env.getProperty("access.token"));
            conn.setRequestProperty("requestHost", env.getProperty("server.de.host"));
            conn.setRequestProperty("requestPort", env.getProperty("server.port"));
            conn.setRequestProperty("requestProtocol",
                                    env.getProperty("server.de.protocol"));
            PrintWriter pout =
                new PrintWriter(
                    new OutputStreamWriter(
                        conn.getOutputStream(), "UTF-8"),
                    true);
            pout.print(payload);
            pout.flush();
            pout.close();

            InputStream isi = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(isi);
            int numCharsRead1;
            char[] charArray1 = new char[1024];

            while ((numCharsRead1 = isr.read(charArray1)) > 0) {
                sb.append(charArray1, 0, numCharsRead1);
            }
            isr.close();
            isi.close();
        }
        catch (MalformedURLException e) {
            logger.error("MalformedURLException in restAccessTokenPOST..." +
                         e.getMessage());
            //e.printStackTrace();
        }
        catch (IOException e) {
            logger.error("IOException in restAccessTokenPOST..." +
                         e.getMessage());
            e.printStackTrace();
        }
        catch (Exception e) {
            logger.error("Exception in restAccessTokenPOST..." +
                         e.getMessage());
            e.printStackTrace();
        }
        finally {
            if (null != conn)
                conn.disconnect();
        }
        return sb;
    }

    @Recover
    public String helpHere(ConnectException cause) {
        System.out.println("Recovery place! ConnectException");
        return "Hello";
    }

    @Recover
    public String helpHere(IOException cause) {
        System.out.println("Recovery place! ArithmeticException");
        return "Hello";
    }

    @Recover
    public String helpHere(Exception cause) {
        System.out.println("Recovery place! Exception");
        return "Hello";
    }

    @Recover
    public String helpHere() {
        System.out.println("Recovery place! Exception");
        return "Hello";
    }

    @Recover
    public String helpHere(Throwable cause) {
        System.out.println("Recovery place! Throwable");
        return "Hello";
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
0
1 035
1

Ответы 1

Учитывая, что вы видите реализацию своей функции restPost(),

@Retryable(value = {IOException.class, ConnectException.class},
           maxAttempts = 4,
           backoff = @Backoff(5000))
public StringBuffer restPost(String restUrl, String payload) {
    try {
        // Your code
    }
    catch(IOException ex){ // These catch block handles the exception
                           // and nothing to throw to retryable.
    }
    catch(MalformedURLException ex){ // More catch blocks that you
                                     // define to handle exception.
    }
}

Здесь вы обрабатываете все исключения, которые могут стать причиной отзыва методов retry и recover.

Note: Recoverable methods only execute when a exception is thrown, not handled by any try-catch block.

Любое исключение, вызванное методом restPost(), обрабатывается самим блоком метода try-catch, и нет никаких исключений, которые были повторно сгенерированы блоком catch.

Теперь Spring-Retry не может получить какое-либо исключение (поскольку оно обрабатывается блоком метода try-catch). Таким образом, метод восстановление выполняться не будет.

Solution: you should remove those catch blocks from the method definition on which you want to perform retry or recover.

Пожалуйста, делайте то, что необходимо, и это сработает как шарм... :)

@Shilpi это решение работает для вас ?? если да, то отметьте его как проверенный ответ ... Спасибо :)

Vikrant Kashyap 27.02.2019 09:41

Другие вопросы по теме