繁体   English   中英

spring 事务超时可配置

[英]spring transaction timeout configurable

我有一个具有固定超时的事务方法。 有没有办法通过即application.yml使事务超时可配置?

@Transactional(propagation = Propagation.REQUIRED, timeout = TIMEOUT)
public String doStuff(String id) throws Exception {
    service.doSomeStuff
}

由于我们无法为 Java 注释属性分配变量值,要以编程方式设置@Transactionaltimeout ,最好的办法是覆盖AbstractPlatformTransactionManager#determineTimeout()

假设您正在使用JpaTransactionManager ,新的管理器看起来像下面的代码。 它允许为每个事务设置超时。 我们可以使用TransactionDefinition的名称来标识一个事务,在 Spring 声明式事务的情况下,默认名称的格式为FullyQualifiedClassName.MethodName

public class FooTransactionManager extends JpaTransactionManager {
    
    private Map<String, Integer> txTimeout = new HashMap<String, Integer>();

    public <T> void configureTxTimeout(Class<T> clazz, String methodName, Integer timeoutSecond) {
        txTimeout.put(clazz.getName() + "." + methodName, timeoutSecond);
    }

    //The timeout set by `configureTxTimeout` will have higher priority than the one set in @Transactional
    @Override
    protected int determineTimeout(TransactionDefinition definition) {;
        if (txTimeout.containsKey(definition.getName())) {
            return txTimeout.get(definition.getName());
        } else {
            return super.determineTimeout(definition);
        }
    }   
}

然后配置PlatformTransactionManager

@Bean
public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
    final FooTransactionManager transactionManager = new FooTransactionManager();
    transactionManager.setEntityManagerFactory(emf);

    transactionManager.configureTxTimeout(Foo.class, "doStuff", 10);
    transactionManager.configureTxTimeout(Bar.class, "doStuff", 20);
    transactionManager.configureTxTimeout(Bar.class, "doMoreStuff", 30);
    //blablabla
    
    return transactionManager;
}

以上代码仅用于演示目的。 实际上,您可以在配置期间使用@Value从外部属性(例如application.yml )中读取值。


2020 年 6 月 25 日更新:

  • 它将在即将到来的 5.3 中提供开箱即用的支持(请参阅

暂无
暂无

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

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