Как обработать тайм-аут транзакции с @TransactionTimeout - PullRequest
0 голосов
/ 15 марта 2020

У меня есть метод:

    @TransactionTimeout(value = 1, unit = TimeUnit.SECONDS)
    @Asynchronous
    public void asyncMethod() {
        System.out.println("start running asyncMethod in thread " + Thread.currentThread().getName());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("finished running asyncMethod in thread " + Thread.currentThread().getName());
    }

Как вы можете видеть, я запускаю это в транзакции, и тайм-аут установлен на 1 секунду, а внутри я сплю 3 секунды. Таким образом, в результате выполнения этого метода я получаю:

javax.transaction.RollbackException

Но, скажем, я хотел бы реализовать сервис, который будет печатать информацию о том, что тайм-аут транзакции произошел для пользователя. Как мне этого добиться?

@ Глейнс дал мне несколько советов в комментариях по использованию Interceptor.

Я добавил что-то вроде этого:

@Interceptor
public class LoggingTimeoutInterceptor {

    @AroundInvoke
    public Object log(InvocationContext ctx) throws Exception {
        try {
            System.out.println("Logger interceptor");
            System.out.println("method " + ctx.getMethod().getName());
            return ctx.proceed();
        }catch (RollbackException e) {
            System.out.println("Transaction RollbackException occured");
            return null;
        } 
        catch (Exception e) {
            System.out.println("Exception occured");
            return null;
        }
    }
}

Этот код пишет Первые два sysout правильно. Но не ловит никаких исключений, и я не знаю почему. Я пытался изменить @AroundInvoke на @AroundTimeout, но тогда он вообще не работает.

...