Java 在Spring事务管理中使用自定义超时

Java 在Spring事务管理中使用自定义超时,java,spring-transactions,properties-file,transactionmanager,Java,Spring Transactions,Properties File,Transactionmanager,在我的项目中,我有几种使用spring@Transactional的方法,如下所示: @Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW) public void addMember(InputParam input) { // do somthing... } @Transactional(value = "sys.tx.mngr", propagation = Propag

在我的项目中,我有几种使用spring
@Transactional
的方法,如下所示:

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW)
public void addMember(InputParam input) 
{
       // do somthing...
}

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW)
public void blockMember(InputBlockParam param) 
{
      // do somthing...
}
@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW,timeout = 40)
public void addMember(InputParam input) 
{
       // do somthing...
}

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW, timeout = 20)
public void blockMember(InputBlockParam param) 
{
     // do somthing...
}
<bean id="sys.tx.mngr" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>

<tx:annotation-driven transaction-manager="sys.tx.mngr" />
然后我为每个方法设置不同的超时,如下所示:

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW)
public void addMember(InputParam input) 
{
       // do somthing...
}

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW)
public void blockMember(InputBlockParam param) 
{
      // do somthing...
}
@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW,timeout = 40)
public void addMember(InputParam input) 
{
       // do somthing...
}

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW, timeout = 20)
public void blockMember(InputBlockParam param) 
{
     // do somthing...
}
<bean id="sys.tx.mngr" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>

<tx:annotation-driven transaction-manager="sys.tx.mngr" />
我想在最后一步设置超时为可配置的属性文件,但我不知道什么。 在
spring事务性
annotation中是否有可配置或动态设置超时的解决方案

编辑: 我在spring上下文文件中定义了sys.tx.mngr
,如下所示:

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW)
public void addMember(InputParam input) 
{
       // do somthing...
}

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW)
public void blockMember(InputBlockParam param) 
{
      // do somthing...
}
@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW,timeout = 40)
public void addMember(InputParam input) 
{
       // do somthing...
}

@Transactional(value = "sys.tx.mngr", propagation = Propagation.REQUIRES_NEW, timeout = 20)
public void blockMember(InputBlockParam param) 
{
     // do somthing...
}
<bean id="sys.tx.mngr" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>

<tx:annotation-driven transaction-manager="sys.tx.mngr" />


或者,在spring上下文文件中,每个方法是否有定义超时的替代方法?

只能通过以下方式完成:-

a) Using Reflection.
b) Using Instrumentation.
c) Using TransactionTemplate (Programatically transaction).
对于(a)和(b),您可以按如下方式上课:-

public class Test implements InitializingBean {

@Autowired
private Environment env;

public void afterPropertiesSet() throws Exception {
System.out.println("Sample prop 1 value : "+env.resolvePlaceholders("${prop1.value}"));
//Code to set/modify Transactional annotation "timeout" 
// attribute values for all methods
}

}
有关如何设置/修改值的链接可在此处找到



对于(c),您可以使用如下配置:-

public class MemberDaoImpl {

@Autowired
private Environment env;
@Autowired
private TransactionTemplate transactionTemplate;

        public void addMember(InputParam input) {  
  transactionTemplate.setTimeout(Integer.parseInt(env.resolvePlaceholders("${addmember.timeout}")));
               // do somthing...
        }

}

<bean id="memberDao" class="com.xxx.impl.MemberDaoImpl">
    <property name="transactionTemplate">
        <bean class="org.springframework.transaction.support.TransactionTemplate">
            <property name="transactionManager" ref="sys.tx.mngr" />
        </bean>
    </property>
</bean>

<bean id="sys.tx.mngr" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf"/>
</bean>
public类成员daoimpl{
@自动连线
私人环境署;
@自动连线
私有事务模板TransactionTemplate;
public void addMember(InputParam input){
transactionTemplate.setTimeout(Integer.parseInt(env.resolvep占位符(“${addmember.timeout}”));
//做点什么。。。
}
}

谢谢。难道没有简单的解决办法吗?我编辑了我的问题。定义您自己的事务管理器,覆盖这些determineTimeout(..),使用threadlocal根据自定义注释或AOP设置超时,有几种实现方法。