You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步方法生成ArrayList并返回至Callback-URL的相关技术疑问

嘿,我来帮你拆解这几个关于异步方法和Callback-URL的问题,结合你给出的Spring Boot代码片段来一步步解释~

问题1:Callback-URL是什么?

你完全猜对了!Callback-URL(回调URL)就是一个预先约定好的、用来接收异步任务返回结果的HTTP端点。

因为你的createCus方法加了@Async注解,是异步执行的——它会在后台线程里慢慢生成数据,不会让前端/调用方一直等着响应。这种情况下,没法像同步接口那样直接把结果返回给原请求,所以就需要Callback-URL:等异步任务完成后,主动把生成好的ArrayList<Customer>推送到这个地址上。

问题2:如何将值返回至Callback-URL?

要实现这个推送,你需要在异步方法里做两件事:

  1. 让调用方把Callback-URL传递给你的接口(比如通过请求参数、路径变量或者请求体);
  2. 用HTTP客户端(推荐Spring的WebClient,适配异步场景)把结果发送到这个URL。

给你修改后的代码示例:

import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient;

import java.util.ArrayList;

@RestController
public class CustomerController {

    @Async
    @GetMapping("/createcustomer/{start}/{end}")
    // 注意:异步方法这里返回void,因为我们要主动推送结果,而非同步返回
    public void createCus(@PathVariable int start, 
                          @PathVariable int end, 
                          @RequestParam String callbackUrl) {
        // 模拟耗时的数据生成逻辑
        ArrayList<Customer> customers = new ArrayList<>();
        for (int i = start; i <= end; i++) {
            customers.add(new Customer("Customer-" + i, i));
            // 模拟耗时操作
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        // 使用WebClient异步发送结果到Callback-URL
        WebClient.create()
                .post() // 一般用POST传递复杂数据
                .uri(callbackUrl)
                .contentType(org.springframework.http.MediaType.APPLICATION_JSON)
                .bodyValue(customers) // 把生成的列表作为JSON请求体发送
                .retrieve()
                .bodyToMono(Void.class)
                .subscribe(); // 触发异步请求
    }
}

// 假设你的Customer实体类
class Customer {
    private String name;
    private int id;

    public Customer(String name, int id) {
        this.name = name;
        this.id = id;
    }

    // 记得加getter/setter,不然JSON序列化会有问题
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
}
问题3:返回值后如何访问该值?

你需要提前写一个接收回调的接口,也就是Callback-URL对应的端点。当异步任务把结果推过来时,这个接口就能直接拿到数据并处理。

示例代码:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;

@RestController
@RequestMapping("/callback")
public class CallbackReceiverController {

    // 这个就是你要传给createCus接口的Callback-URL:http://your-server-ip:port/callback/receive-customers
    @PostMapping("/receive-customers")
    public ResponseEntity<String> receiveCustomers(@RequestBody ArrayList<Customer> customers) {
        // 在这里处理接收到的结果:比如存数据库、做业务逻辑、打印日志等等
        System.out.println("🎉 收到异步生成的客户数据,共" + customers.size() + "条");
        
        // 可以返回一个确认响应给异步任务,告诉它结果已成功接收
        return ResponseEntity.ok("客户数据接收成功");
    }
}

额外提醒

  • 要确保你的Spring项目已经开启异步支持:在启动类上加@EnableAsync注解;
  • 考虑Callback的可靠性:如果推送失败(比如网络问题),最好加重试机制;
  • 如果Callback-URL是外部地址,要配置CORS允许跨域请求;
  • 自定义异步线程池:Spring默认的异步线程池容量有限,大量异步任务可能会阻塞,建议自己配置线程池参数。

内容的提问来源于stack exchange,提问作者elp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:42:09