我需要做一些我不知道的事情,这是对此的最佳实践。
在我向特定服务发送一个请求后,这个请求返回 OK 并将我的请求排队。我有一个回调服务,用于在结束时通知。
问题是整个过程可能会花费很长时间,并且在没有任何通知的情况下结束,之后我需要考虑超时。
应用程序是 SpringBoot APP,我正在考虑在具有 sleep 时间的服务方法上使用注解 @EnableAsync 和 @Async。
@Configuration
@EnableAsync
public class AsyncConfiguration implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("TIMCLL-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
// TODO Auto-generated method stub
return null;
}
}
. . .
@Async
public void verifyStatusTimPayment() throws InterruptedException {
Thread.sleep(5000);
logger.info( "Executed after 5s " + new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date()));
}
验证需要在请求后 15 分钟完成,并且每个请求只需进行一次。
我如何在不创建 Thread.sleep 的情况下执行此操作?????
最佳答案
您可以使用 ScheduledExecutorService安排任务
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
...
scheduler.schedule(() -> {yourtaskhere}, 15, TimeUnit.MINUTES);
但是这不是你想要的。如果服务器在任务的调度和执行之间死机怎么办?你会失去你的任务。 如果您将消息保存在队列中并稍后检索它,或者使用任何使用持久性的调度程序(la Quartz),那会更好
关于java - Spring 任务异步和延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40917369/