在春季启动中创建计划方法的最佳实践

时间:2018-11-27 11:39:19

标签: java spring spring-boot scheduled-tasks scheduling

从next(或您的变体)创建调度程序的最佳方法是什么:

1)对于一种调度方法,请从该方法创建一个组件并调用服务:

@Component
public class MyScheduler {

    private final MyService myService;

    public MyScheduler(MyService myService) {
        this.myService= myService;
    }

    @Scheduled(fixedDelay = 1L)
    public void process() {
     myService.startSomethig();
    }
}

2)为所有计划的方法创建一个组件,并为具体方法启动服务:

@Component
public class MySchedulers {

    private final MyService1 myService1;
    private final MyService2 myService2;
    private final MyService3 myService3;

    public MySchedulers (MyService1 myService1, MyService2 myService2, MyService3 myService3) {
        this.myService1 = myService1;
        this.myService2 = myService2;
        this.myService3 = myService3;
    }

    @Scheduled(fixedDelay = 100L)
    public void process() {
     myService1.startSomethig();
    }

     @Scheduled(fixedDelay = 666L)
    public void process() {
     myService2.startAny();
    }

    @Scheduled(fixedDelay = 999L)
    public void process() {
     myService3.startAll();
    }
}

3)在每个concreate服务中创建计划的方法:

@Service
public class MyServiceImpl implements MyService {

     //filds, constructor

    @Scheduled(fixedDelay = 100L)
    public void process() {
       startSomethig();
    }

    @Transactional
    @Override
    public void startSomethig() {
        //...
    }

哪种方法更好?也许还有其他?我很高兴听到您的意见

2 个答案:

答案 0 :(得分:2)

没有最好的方法,这都是“依赖”的。

1)。这与我通常做的事情很接近-我创建一个名称以“ Job”结尾的类,例如“ GenerateReportJob”,该类的调度方法通常只是调用另一个服务类。

2)。如果您安排了使用相同依赖项的计划作业,并且其目的是相互关联的,则将它们放在同一类中没有错。但是,您应该避免为应用程序中所有可能的计划作业仅创建一个类,因为它会迅速变成巨大的文件,并且很难推理出很多依赖项。

3)。我避免将@Scheduled直接放在服务方法上,因为我很难找到应用程序中的所有作业。从技术上讲,它可以工作,但是我认为它对开发人员不友好。

答案 1 :(得分:1)

我更喜欢并为我的项目实施了第二种方法。

选择此方式的主要原因是对所有定期任务进行集中控制。我项目中的计划任务需要大量使用数据库,因此可以防止正在运行的作业重叠。

第二个原因是代码的可读性。共同开发人员更容易找到新添加的计划任务。

最后,我同意Maciej的看法。最适合您的模型取决于您的任务和观点,以便为您自己的项目创建良好的结构。