gpt4 book ai didi

java - spring 事务超时可配置

转载 作者:行者123 更新时间:2023-12-04 12:11:13 26 4
gpt4 key购买 nike

我有一个具有固定超时的事务方法。有没有办法通过 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 中提供开箱即用的支持(参见 this)
  • 关于java - spring 事务超时可配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54151182/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com