代码之家  ›  专栏  ›  技术社区  ›  kakoli

在Springboot Java微服务中实现回调

  •  0
  • kakoli  · 技术社区  · 2 年前

    预先存在: 非UI Java客户端程序调用基于REST的web服务API。该请求有一个callback_url和一个唯一的标识符。除了请求模式之外,对客户端一无所知。

    要求: 服务器将被开发为Java Springboot微服务,在RESTAPI中公开CRUD操作。 服务器端:创建请求需要很长时间才能完成。因此,它不可能是同步的。收到请求后,服务器进行基本的模式验证,启动一些异步任务(如对外部服务的调用或可能需要时间的数据库操作),并向客户端返回响应。 只要异步任务的结果可用,服务器就会调用带有结果数据和操作状态的callbackUrl。

    服务器使用SpringWebMVC框架实现为Springboot Web服务。

    问题 :Spring中生成异步任务可以通过使用线程执行器和CompletableFuture或@async annotation来完成。推荐哪一个? 当异步任务完成后,如何通过回调url调用客户端API返回结果数据?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Eduardo Felipe Zambom Santana    2 年前

    我认为CompletableFuture和@Async都运行良好。我更喜欢@Async,因为它在大多数功能上更像Spring的工作方式。

    您可以为@Async配置线程执行器,如下所示:

    @Configuration
    @EnableAsync
    public class SpringAsyncConfig implements AsyncConfigurer {
       @Override
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
            threadPoolTaskExecutor.initialize();
            return threadPoolTaskExecutor;
        }
    }
    

    关于第二个问题,我认为当async方法完成时,可以使用spring RestTemplate或WebClient来调用callback_url。

    在这两种情况下,使用@Async或Completable Future,可以使用Future类来验证处理何时完成。

    Future<Object> future = asyncService.asyncMethod();