我正在尝试提供ScheduledExecutor
服务以每天在特定时间运行MyTask
。我的问题是任务使用@Service
组件,并且如果我在没有@Autowire
的情况下执行@Component
,则该服务将无法正常工作,如果我将@Component
放到MyTask
上,则无论该组件如何Scheduler
在哪里。
我尝试通过构造函数和@DependsOn
发送服务,但没有用。
@Component
public class MyRunnable implements Runnable {
@Autowired
private Service service;
@Override
public void run() {
//some code
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new MyTask(),
initalDelay,
TimeUnit.DAYS.toSeconds(1),
TimeUnit.SECONDS);
}}
如果将@Component
放在此处,则首先运行
public class MyTask extends TimerTask {
@Autowired
private Service service;
}
将任务定义为
公共类MyTask扩展了TimerTask {
private final DataSetService dataSetService
public MyTask(DataSetService dataSetService) {
this.dataSetService = dataSetService;
}
// Your other code here
}
和您的MyRunnable为
@Component
public class MyScheduler {
@Autowired
private final DataSetService dataSetService
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
@PostConstruct
public void startScheduler() {
scheduler.scheduleAtFixedRate(new MyTask(dataSetService),
initalDelay,
TimeUnit.DAYS.toSeconds(1),
TimeUnit.SECONDS);
}
您可以看到,MyRunnable(现在重命名为MyScheduler)不再实现不必要的Runnable,它是一个Spring bean,在实例化后,PostConstruct启动调度程序。