java - Spring 任务异步和延迟

标签 java spring asynchronous task

我需要做一些我不知道的事情,这是对此的最佳实践。

在我向特定服务发送一个请求后,这个请求返回 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/

相关文章:

java - 在 spring 上下文中通过类路径引用文件

java - 在 XmlRpc 服务中获取 cookie

java - List<HashMap<String,Object>> 的 Thrift 类型建模

java - 是否有类似于 Java 的 lxml 或 nokogiri 的库?

Spring JPA 存储库 Autowiring 问题

python - 如何异步迭代范围

C#异步套接字问题

c# - 并行运行多个 EntityFramework 数据库查询

java - 在 Selenium Webdriver 中切换到父窗口

java - 是否可以使用推送通知来终止使用运行同一应用程序的另一台设备的 Activity