当用户发送请求时,请求中的信息将被发送到远程网站。然后,我想调用API来检查请求是否成功发送。如果我立即调用它,它什么都不返回,所以应该在几秒后调用API。
是否有任何方法让Controller 睡眠一段时间,或者做一个任务并在一段时间后自动执行?
答案 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