Java 在spring boot中创建计划方法的最佳实践

Java 在spring boot中创建计划方法的最佳实践,java,spring,spring-boot,scheduled-tasks,scheduling,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

从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() {
        //...
    }

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

没有最好的办法,这一切都“视情况而定”

1) 。这与我通常所做的很接近——我创建了一个名称以“Job”结尾的类,比如“GenerateReportJob”,它有一个调度方法,该方法通常只调用另一个服务类

2) 。如果您有使用相同依赖项的计划作业,并且它们的用途彼此相关,那么将它们放在同一个类中没有什么错。但是,您应该避免为应用程序中所有可能的计划作业创建单个类——它将很快成为一个巨大的文件,并且具有许多难以解释的依赖关系


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

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

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

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

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