从异步运行方法返回值到回调URL

时间:2018-04-21 17:11:30

标签: java spring rest asynchronous callback

我想触发一种方法来创建ArrayListreturn此列表到callback-URL。此方法可能需要一段时间才能生成数据,因此它应该是异步运行方法。 所以我有几个问题:

  • 什么是callback-URL?我假设这是URL方法将值返回到?
  • 如何return valuecallback-URL
  • 如何在返回后访问该值?

    @Async
     @GetMapping("/createcustomer/{start}/{end}"){
      public ArrayList<Customer> createCustomer(@PathVariable int start, 
      @PathVariable int end) {
    
      //code to generate random data 
      return arrayList;
      }
    

1 个答案:

答案 0 :(得分:1)

为了调用您的处理程序方法,您可以在前端使用javascript代码。以下是如何使用axios库执行此操作的示例:

axios.get('createcustomer/something/something')
  .then(function (response) {
    console.log(response);
    // response.data will contain your json with returned list content
  })
  .catch(function (error) {
    console.log(error);
  });

您还需要修改您的hanlder方法,如下所示:

@ReponseBody
@GetMapping("createcustomer/{start}/{end}"){
 public ArrayList<Customer> createCustomer(@PathVariable int start, 
 @PathVariable int end) {

 //code to generate random data 
 return arrayList;
 }

@ResponseBody注释将导致ArrayList作为响应正文中的json返回。或者,您可以将@Controller类注释更改为@RestController。它将使此类中的所有处理程序方法返回给客户端。

这样,请求将完全异步,您可以在前端代码中尽快访问它。

修改

如果你想使用callback-url在其他地方发送这个列表,你可以使用RestTemplate发送带有list作为正文的post请求。您可以在处理程序方法中使用与此代码类似的内容:

String callback-URL = "http://my.server.com/customerListEndpoint";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> entity = new HttpEntity<>(headers);
restTemplate.exchange(callback-URL,HttpMethod.POST,entity,ArrayList.class);

您需要一个可以使用post back-URL映射请求的端点。类似的东西:

@PostMapping("/customerListEndpoint"){
 public void createCustomer(@RequestBody ArrayList<Customer> arrayList) {
    // do what you want with arrayList here
 }

另外,请务必在某些类中配置RestTemplate bean,并使用@Configuration配置:

   @Bean
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setOutputStreaming(false);
        RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));
        restTemplate.getMessageConverters()
                .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;
    }