ScheduledExecutorService与自动连线服务有关的问题

问题描述 投票:1回答:1

我正在尝试提供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;
 }
java spring autowired scheduledexecutorservice
1个回答
0
投票

将任务定义为

公共类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启动调度程序。

© www.soinside.com 2019 - 2024. All rights reserved.