Mar*_*cos 4 java spring hibernate spring-transactions
我有一个具有固定超时的事务方法。有没有办法通过 ie 使事务超时可配置application.yml?
@Transactional(propagation = Propagation.REQUIRED, timeout = TIMEOUT)
public String doStuff(String id) throws Exception {
service.doSomeStuff
}
Run Code Online (Sandbox Code Playgroud)
正如我们不能将变量值的Java注释属性,以编程方式设置@Transactional的timeout,最好的办法是重写AbstractPlatformTransactionManager#determineTimeout()。
假设您正在使用JpaTransactionManager,新管理器看起来像下面的代码。它允许为每个事务设置超时。我们可以使用TransactionDefinition's name 来标识一个事务,在 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后配置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;
}
Run Code Online (Sandbox Code Playgroud)
以上代码仅用于演示目的。实际上,您可以使用在配置期间@Value从外部属性(例如application.yml)读取值。
2020 年 6 月 25 日更新:
| 归档时间: |
|
| 查看次数: |
4884 次 |
| 最近记录: |