问题陈述的虚拟代码段:
计划程序方法
@Scheduled(fixedRate = 30000)
@Transactional(readOnly = true)
public void scheduledTask() {
TaskExecutor threadPool = ctx.getBean(TaskExecutor.class);
long totalCount = someDao.someOperation("argument");
Runner runner;
for (int offset = 0; offset < totalCount; offset += 50) {
runner = ctx.getBean(Runner.class);
runner.setOffset(offset);
threadPool.execute(runner);
}
}
可运行的实现
@Component
@Scope(scopeName="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
@Transactional
public class Runner implements Runnable {
private Integer offset;
private Integer limit;
private ISomeDao someDao;
public Runner(ISomeDao someDao) {
this.someDao = someDao;
}
public void setOffset(int offset) {
this.offset = offset;
this.limit = this.offset + 50;
}
@Override
public void run() {
List<Operation> operations = someDao.fetchData(offset, limit, someCriteria);
///
/// other business logic
}
}
我面临的问题:
在scheduleTask中,程序正确设置了offset的值(在调试模式下检查), 但在Runner类的run方法中无法访问它,将其始终偏移为null。 当我从Runner类中删除spring批注并手动将其实例化时 cheduleTask然后我可以访问偏移值,但是它将抛出异常 没有可用的事务管理器。
我还尝试将EntityManger注入
runner = ctx.getBean(Runner.class, ctx.getBean(EntityManager.class);
在ScheduledTask中 当我删除Spring注释时,问题仍然存在,因为Thread不是由Spring管理的
我已经花了一个小时寻找解决方案。