У меня есть метод:
@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
, но тогда он вообще не работает.