【问题标题】:Send an response 200 from a Spring boot controller for asyncronus processing从 Spring 引导控制器发送响应 200 以进行异步处理
【发布时间】:2021-10-12 02:53:55
【问题描述】:

我有一个场景: 我有一个控制器。 我的控制器正在调用服务类。服务类将从数据库中获取所有记录并将其发布到 kafka。但是我不希望调用 api 的客户端等到整个数据都发布到 kafka。我希望它以异步方式进行。客户的工作只是调用 api 而已。我们会立即发送 200 响应码。

在后端,将从 DB 获取数据并处理到 kafka。 您能否建议如何做到这一点。

public class SampleController {

    private  SampleService sampleService;
        @PostMapping("/")
        public String handleAsyncResponse(@RequestBody Requestbean bean) {
        sampleService.posttokafka(bean);
    }
}

谢谢

【问题讨论】:

  • 您可以尝试使用 Webflux。它的响应式模式可以实现你想要的,也有助于高效的数据检索和发布到 Kafka。
  • 另一种可能性是使用 Spring 的 @Async 注释。例如,请参阅this article over at baeldung
  • 嗨 @Nick 有任何示例代码可以参考上述案例吗?我从未在 webflux 上工作过。所以,不知道
  • @Debo 我没有任何简单的例子,但这篇文章会帮助你spring.io/guides/gs/reactive-rest-service。另一方面,正如 Turing85 建议的那样,@Async 也将是选项。
  • 请注意,正确的响应是 202 而不是 200。

标签: java spring-boot spring-batch


【解决方案1】:

可以通过@Async方式实现,如下,先定义一个bean:

@Configuration
public class SThreads {
    @Bean
    public TaskExecutor concurrentTasks() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4);
        executor.setMaxPoolSize(4);
        executor.setThreadNamePrefix("default_task_executor_thread");
        executor.initialize();
        return executor;
    }
}

然后用@Async("concurrentTasks")注释任务

@Async("concurrentTasks")
public static void myAsyncTask() throws ExecutionException, InterruptedException {
    ....
}

然后你可以调用myAsyncTask,它不会阻塞调用者。

【讨论】:

  • 非常感谢@Nick :-)..让我试试这个代码......我可以从我的控制器调用这个 myAsyncTask(),对吗?
  • HI @Nick 另一个要求..现在 myAsyncTask 将由 4 个并行线程执行。现在 myAsyncTask 在我的情况下所做的是使用 jpa 存储库从数据库中读取数据并将其放入 kafka。有 16 k 条记录。当全部 16 条记录完成后,我没有通过电子邮件通知客户。 publishtokafka() 正在这样做..我该如何处理?如何知道 myAsyncTask() 已完成执行,以便我可以通知客户端
  • @Debo 不,您的任务将在其中一个线程中执行。要执行 4 个并行任务,您必须创建单独的 Runnable 实例。对于其他主题 - 请作为单独的 SO 问题提出后续问题
  • @Debo myAsyncTask 将作为一个实例运行,除非其代码如此说明,否则它不会在自己的块中异步。您可以在主线程或其他地方拥有一些状态,一旦您的 myAsyncTask 完成其部分,您就可以更新这些状态。
猜你喜欢
  • 2017-12-26
  • 2023-03-27
  • 2014-12-22
  • 1970-01-01
  • 2015-10-19
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多