Java Spring Boot:像线程这样的可伸缩任务-如何做?

Java Spring Boot:像线程这样的可伸缩任务-如何做?,java,spring,spring-boot,Java,Spring,Spring Boot,我从Spring Boot开始,希望执行任务 假设我的应用程序认识不同的客户机。对于任何客户,我都喜欢定期进行操作(例如,每分钟检查一次邮件帐户)。在应用程序的执行过程中,客户端的数量可能会有所不同(例如,数据库表会随时间增长或收缩) 在一个“普通”程序中,我会为任何在无限循环中延迟处理邮件的客户机启动一个线程。在执行期间,线程的数量会有所不同 如何使用Spring Boot执行此类任务? 我希望除了框架外的线程之外还有一些工具 我知道组件带有@Scheduled,但这是静态的,不能动态控制(据

我从Spring Boot开始,希望执行任务

假设我的应用程序认识不同的客户机。对于任何客户,我都喜欢定期进行操作(例如,每分钟检查一次邮件帐户)。在应用程序的执行过程中,客户端的数量可能会有所不同(例如,数据库表会随时间增长或收缩)

在一个“普通”程序中,我会为任何在无限循环中延迟处理邮件的客户机启动一个线程。在执行期间,线程的数量会有所不同

如何使用Spring Boot执行此类任务? 我希望除了框架外的线程之外还有一些工具


我知道组件带有@Scheduled,但这是静态的,不能动态控制(据我所知)。

您可以使用spring TaskScheduler。假设您有一个客户端处理程序组件,负责为每个客户端安排和停止作业

您可以插入TaskScheduler:

@Autowired
private TaskScheduler taskScheduler;
然后在应用程序需要时为特定客户端启动作业:

CronTrigger cronTrigger = new CronTrigger(yourCronExpression);
ScheduledFuture<?> jobHandler = this.taskScheduler.schedule(new Runnable() {
    @Override
    public void run() {
        // You can put your code here or get statically an instance of a component to invoke
    }
}, cronTrigger);

有几种方法可以做到这一点,我想这取决于你是否能在时间表内为客户完成所有工作

如果可以,您可以简单地循环检查所有客户机的邮件。如果您不能在计划的操作中执行该操作,则您不执行该操作,而是计算需要执行的操作,并将该操作放入队列中,则每个客户端可能有一条消息,或者您可能会批处理一些客户端,然后会有工作人员从该队列中读取工作


如果您的队列开始堆积,并且工作比您能做的更快,那么请调整您的日程安排以减少频率,或者添加工作人员。

在“正常”程序中,我会为正常程序中的任何客户端启动线程。您不应该这样做,而应该使用
ScheduledExecutorService
。好的,但这也是春装的最佳方式吗?
this.yourHandlersMap.get(clientId).cancel(false);