在bean方法原型的可运行实现中使用Setter方法设置的值在run方法中不可访问

时间:2019-01-01 07:54:58

标签: spring spring-boot spring-data-jpa

问题陈述的虚拟代码段:

   计划程序方法

@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管理的

我已经花了一个小时寻找解决方案。

0 个答案:

没有答案