Как выбросить исключение из декларативных методов повторной попытки Spring AOP?

Я реализую некоторую обработку повторных попыток в своих методах, используя Spring Retry.

У меня есть уровень доступа к данным (DAL) в моем приложении и уровень обслуживания в моем приложении.

Уровень «Мой сервис» вызывает DAL, чтобы установить удаленное соединение для получения информации. Если DAL терпит неудачу, он повторит попытку. Однако, если количество повторных попыток не удается, я хотел бы повторно создать исключение.

В моем текущем проекте я что-то очень похожее на это:

@Configuration
@EnableRetry
public class Application {

    @Bean
    public Service service() {
        return new Service();
    }

}

@Service
class Service {

    @Autowired
    DataAccessLayer dal;

    public void doSomethingWithFoo() {
        Foo foo = dal.getFoo()
        // do something with Foo
    }

}

@Service
class DataAccessLayer {
    @Retryable(RemoteAccessException.class)
    public Foo getFoo() {
        // call remote HTTP service to get Foo
    }
    @Recover
    public Foo recover(RemoteAccessException e) {
       // log the error?
       // how to rethrow such that DataAccessLayer.getFoo() shows it throws an exception as well?
    }
}

В моем приложении есть служба, и эта служба вызывает DataAccessLayer getFoo. Если getFoo терпит неудачу несколько раз, DAL будет обрабатывать повторные попытки. Если после этого ничего не получится, я бы хотел, чтобы мой сервисный уровень что-то с этим сделал. Однако я не знаю, как об этом сообщить. Я использую intelliJ, и когда я пытаюсь throw e; в методе @Recover recover, я не получаю никаких предупреждений о том, что DataAccessLayer.getFoo выдает какие-либо исключения. Я не уверен, что так будет. Но я бы хотел, чтобы среда IDE предупредила меня, что, когда повторные попытки завершатся неудачно, будет выдано новое исключение, чтобы уровень службы знал, что его ожидает. В противном случае, если он вызывает dal.getFoo, он не знает, как обрабатывать какие-либо ошибки. Как это обычно делается? Не следует ли мне использовать декларативный стиль АОП в пользу императивного?


person alex    schedule 26.10.2020    source источник
comment
Думаю, нет предупреждения, потому что org.springframework.remoting.RemoteAccessException расширяет RuntimeException?   -  person pirho    schedule 26.10.2020


Ответы (1)


Вы можете изменить getFoo()recover()), чтобы добавить throws <some checked exception> и заключить в него RemoteAccessExceptionrecover()).

Это заставит уровень обслуживания перехватить это исключение.

person Gary Russell    schedule 26.10.2020
comment
Привет, Гэри, спасибо, что прыгнул! Да, я обнаружил, что могу сделать это, единственное, что мне нужно, - это что-то, что заставит добавить throws в мой метод. Если количество повторных попыток исчерпано, метод все равно вызовет исключение, но оно не будет обнаружено во время компиляции. - person alex; 27.10.2020
comment
Понятно. Я углублюсь в изучение этих вопросов. Спасибо. - person alex; 27.10.2020