Java Spring调度程序-当存在循环依赖项时,调度方法不会';不能在事务中启动
我正在开发一个使用Spring3、Hibernate和JPA的应用程序。我有两门课,如下:Java Spring调度程序-当存在循环依赖项时,调度方法不会';不能在事务中启动,java,spring,spring-transactions,spring-scheduled,Java,Spring,Spring Transactions,Spring Scheduled,我正在开发一个使用Spring3、Hibernate和JPA的应用程序。我有两门课,如下: @Component class Manager { @Autowired Util util; } 及 应用程序上下文中的相关部分如下所示: <context:component-scan base-package="packageName" /> <tx:annotation-driven /> <bean id="entityM
@Component
class Manager {
@Autowired
Util util;
}
及
应用程序上下文中的相关部分如下所示:
<context:component-scan base-package="packageName" />
<tx:annotation-driven />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="defaultPU" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<task:annotation-driven executor="executor" scheduler="scheduler"/>
<task:executor id="executor"
pool-size="10"
queue-capacity="10000"
rejection-policy="CALLER_RUNS"/>
<task:scheduler id="scheduler" pool-size="10"/>
如果我从Util类中删除Manager类的自动连接,它就可以正常工作。此外,在调试时,我发现即使应用程序上下文文件中有一些错误,调度方法也会开始执行
由于某些遗留原因,我无法避免循环依赖。
有人能帮助解释为什么在循环依赖的情况下会发生这种异常吗?您可以使用@PostConstruct实现这一点
@Component
class Manager {
Util util;
public void setUtil(Util util) {
this.util = util;
}
}
@Component
class Util {
@Autowired
Manager manager;
@PostConstruct
public void init(){
manager.setUtil(this);
}
@Scheduled(fixedDelay = 1 * 60 * 1000)
@Transactional(propagation = Propagation.REQUIRED)
public void scheduledMethod(){
// Need to update the database in a transaction
}
}
似乎调度后处理器处理裸bean,即使它应该在AOP代理创建者之后触发(因为后处理器是有序的)。我认为你可以给Spring JIRA发送一个bug,至少这种行为的文档记录得很差。作为一种解决方法,您可以使用调度方法从单独的bean中激发事务性方法,或者在事务性的情况下使用TransactionTemplate。
javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:978)
at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
at com.sun.proxy.$Proxy43.flush(Unknown Source)
at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at com.sun.proxy.$Proxy43.flush(Unknown Source)
@Component
class Manager {
Util util;
public void setUtil(Util util) {
this.util = util;
}
}
@Component
class Util {
@Autowired
Manager manager;
@PostConstruct
public void init(){
manager.setUtil(this);
}
@Scheduled(fixedDelay = 1 * 60 * 1000)
@Transactional(propagation = Propagation.REQUIRED)
public void scheduledMethod(){
// Need to update the database in a transaction
}
}