从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() {
//...
}
哪种方法更好?也许还有其他?我很高兴听到您的意见
答案 0 :(得分:2)
没有最好的方法,这都是“依赖”的。
1)。这与我通常做的事情很接近-我创建一个名称以“ Job”结尾的类,例如“ GenerateReportJob”,该类的调度方法通常只是调用另一个服务类。
2)。如果您安排了使用相同依赖项的计划作业,并且其目的是相互关联的,则将它们放在同一类中没有错。但是,您应该避免为应用程序中所有可能的计划作业仅创建一个类,因为它会迅速变成巨大的文件,并且很难推理出很多依赖项。
3)。我避免将@Scheduled
直接放在服务方法上,因为我很难找到应用程序中的所有作业。从技术上讲,它可以工作,但是我认为它对开发人员不友好。
答案 1 :(得分:1)
我更喜欢并为我的项目实施了第二种方法。
选择此方式的主要原因是对所有定期任务进行集中控制。我项目中的计划任务需要大量使用数据库,因此可以防止正在运行的作业重叠。
第二个原因是代码的可读性。共同开发人员更容易找到新添加的计划任务。
最后,我同意Maciej的看法。最适合您的模型取决于您的任务和观点,以便为您自己的项目创建良好的结构。