【问题标题】:only heat a URI, not wait for responce in Spring Rest只加热一个 URI,而不是等待 Spring Rest 中的响应
【发布时间】:2018-12-11 12:38:12
【问题描述】:

假设我使用 POSTMAN 点击 URI localhost:8080/admin/helloHello 类 POST JSON 对象,并有一个类似的控制器,

@RequestMapping(value = "/hello", method = RequestMethod.POST)
public ResponseEntity<Hello> helloHome(@RequestBody Hello obj){
//here it goes to service class and doing processes...
return new ResponseEntity<Hello>(obj, HttpStatus.OK);
}

我只希望 URI 命中控制器而不等待响应(因为处理所有服务类进程需要 10 秒但我想立即返回而不响应)。

我该如何实现它?

【问题讨论】:

  • 您是否希望处理完成??您希望处理有什么结果吗?
  • 感谢快速回复,在这里我只想要保存对象的热 URI,或者我不想要任何响应。我只想快速返回,没有任何对象。我还检查了Void,但这也需要时间。

标签: java spring spring-boot spring-restcontroller


【解决方案1】:

将所有处理逻辑移动到服务类(如果您还没有)并使用@Async 注释您的服务类方法。这将使方法调用在单独的线程中执行,并且控制器方法不会等待服务类方法完成。

@RequestMapping(value = "/hello", method = RequestMethod.POST)
public ResponseEntity<Hello> helloHome(@RequestBody Hello obj){
  helloHomeService.processRequest(obj);
  return new ResponseEntity<Hello>(obj, HttpStatus.OK);
}

public Class HomeService{
@Async
public void processRequest(Hello obj){
  //processing logic
}

}

【讨论】:

  • 你好谢谢你的回答,你可以在这里指导我。当我们为每个服务创建单独的线程时。这个线程是自动停止还是通过处理手动停止...
  • 您没有明确创建线程。 @Async 注释可以为您做到这一点。一旦执行完成,它将自动停止。还有一点需要注意,您必须在应用程序类中使用 @EnableAsync
【解决方案2】:

您可以通过配置启用异步处理。

@Configuration
@EnableAsync
public class YourConfig

现在您可以添加服务并在其中一个方法上启用异步处理,方法是使用 @Async 对其进行注释。调用后会立即返回。

@Async
public void asyncMethodOnAService() {}

如果你想服务返回一个值你可以返回一个CompletableFuture

@Async
public CompletableFuture<String> asyncMethodOnAService() {}

调用异步方法的控制器可以返回一个DeferredResult,这将让客户端知道一旦异步处理完成,结果将可用。

    @RequestMapping(value = "/async", method = RequestMethod.GET)
    public DeferredResult<ResponseEntity<String>> doAsync() {

      DeferredResult<ResponseEntity<String>> result = new DeferredResult<>();
      this.asyncService.asyncMethodOnAService().whenComplete((serviceResult, throwable) -> result.setResult(ResponseEntity.ok(serviceResult)));

      return result;
    }

【讨论】:

    【解决方案3】:

    您可以使用@EnableAsync 启用异步:

    @Configuration
    @EnableAsync
    class AsyncConfig{}
    
    @Component  //in order to be scanned
    class YourService{
    @Async
    public void asyncMethod(args){}
    }
    }
    
    in your controller:
    @Autowired
    private YourService service;
    ....
    
    public ResponseEntity<Hello> helloHome(@RequestBody Hello obj){
      service.asyncMethode(params);
      return new ResponseEntity<Hello>(obj, HttpStatus.OK);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2020-02-14
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多