Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring事务超时可配置_Java_Spring_Hibernate_Spring Transactions - Fatal编程技术网

Java spring事务超时可配置

Java spring事务超时可配置,java,spring,hibernate,spring-transactions,Java,Spring,Hibernate,Spring Transactions,我有一个具有固定超时的事务方法。是否有办法通过应用程序.yml配置事务超时 @Transactional(propagation = Propagation.REQUIRED, timeout = TIMEOUT) public String doStuff(String id) throws Exception { service.doSomeStuff } 由于我们无法将变量值分配给Java annotation属性,为了以编程方式设置@Transactional的超时,最好的办法

我有一个具有固定超时的事务方法。是否有办法通过
应用程序.yml
配置事务超时

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

由于我们无法将变量值分配给Java annotation属性,为了以编程方式设置
@Transactional
超时,最好的办法是覆盖
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);
        }
    }   
}
以上代码仅用于演示目的。实际上,您可以在配置期间使用
@Value
从外部属性(例如
application.yml
)读取值


更新日期:2020年6月25日:

  • 在接下来的5.3中,它将得到开箱即用的支持(参见)

timeout=timeout,这里timeout作为配置传递,是一个变量,您可以使用@Transactional(propagation=propagation.REQUIRED,timeout=10),您还需要什么?@Anurag Sharma,因为他想通过编程设置超时,该值是从属性文件读取的。但是java注释只允许属性为常量。
@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;
}