1

我的项目中有几种使用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...
}

我想在最后一步将超时设置为由属性文件配置,但我不知道是什么。spring Transactional在可配置或动态的注释中设置超时是否有任何解决方案?

编辑:sys.tx.mngr在spring上下文文件中定义如下:

<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" />

或者是否有其他方法可以在每个方法的弹簧上下文文件中定义超时?

4

1 回答 1

1

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

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>
于 2015-09-22T11:24:14.380 回答