繁体   English   中英

如何使用@TransactionTimeout 处理事务超时

[英]How to handle Transaction timeout with @TransactionTimeout

我确实有方法:

    @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());
    }

如您所见,我在 Transaction 中运行它,超时设置为 1 秒,在里面我有 3 秒的睡眠时间。 因此,由于运行此方法,我开始:

javax.transaction.RollbackException

但是假设我想实现一个服务,该服务将向用户打印事务超时发生的信息。 我怎么能做到这一点?

@Glains 在评论中给了我一些使用拦截器的建议。

我添加了类似的东西:

@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;
        }
    }
}

这段代码正确地编写了前两个系统输出。 但没有捕捉到任何异常,我不知道为什么。 我试图将@AroundInvoke更改为@AroundTimeout但后来它根本没有运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM