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



从下一个(或您的变体(开始创建调度器的最佳方式是什么:

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的观点。最适合你的模型取决于你的任务和你的观点,为你自己的项目创建一个良好的结构。

相关内容

最新更新