Spring Controller在10秒后完成一些工作

时间:2016-08-24 17:30:16

标签: java spring spring-mvc

当用户发送请求时,请求中的信息将被发送到远程网站。然后,我想调用API来检查请求是否成功发送。如果我立即调用它,它什么都不返回,所以应该在几秒后调用API。

是否有任何方法让Controller 睡眠一段时间,或者做一个任务并在一段时间后自动执行?

2 个答案:

答案 0 :(得分:3)

要睡10秒钟,您可以使用Thread.sleep()

Thread.sleep(10000);

但要注意这个方法,它会阻塞你的线程,并且在超时到期之前不让它处理其他用户请求。如果您有许多此类请求并行运行,它可能会导致线程池耗尽(最后请求超时)。

要在10秒后执行某项任务,您可以使用Timer.schedule()

new Timer().schedule(
    new TimerTask() {
        @Override
        public void run() {
            // Your code here
        }
    }, 
    10000
);

此调用将立即返回并稍后在单独的线程中执行检查。这种方法更加安全和可扩展。

如果您需要对延迟任务进行更多控制,您还可以使用ScheduledExecutorService。它将允许您定义将执行任务的线程池的大小,取消挂起的任务,从中获取结果等。:

// Create a pool of threads to execute checks
private final ScheduledExecutorService scheduler =
        Executors.newScheduledThreadPool(poolSize);

// In the request handler:
ScheduledFuture<?> future = scheduler.schedule(() -> {
    // Your code here
}, 10, TimeUnit.SECONDS);

答案 1 :(得分:3)

让我总结一下。如果您需要立即响应,可以在服务/控制器方法上使用@Async注释(注意,您需要通过@EnableAsync配置注释启用它。

@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}

接下来,autowire嵌入式弹簧调度程序:

@Autowired 
private TaskScheduler taskScheduler;

最后,安排执行:

taskScheduler.schedule(
    () -> {/*task code*/}, 
    new Date(OffsetDateTime.now().plusSeconds(10).toInstant().toEpochMilli())
);

有关春季异步处理和日程安排的更多详细信息,您可以找到here