2016-12-01 123 views
5
@RequestMapping(value = "/endpoint", method = RequestMethod.POST) 
    public ResponseEntity<?> endpoint(@RequestBody final ObjectNode data, final HttpServletRequest request) { 
     somefunction(); 
     return new ResponseEntity<>(HttpStatus.OK); 
    } 


public somefunction() { 
..... 
} 

在Java弹簧控制器中,我有一个端点。当这个端点被调用时,我希望它直接返回,不要等到somefunction()完成。任何人都可以教我如何处理这个问题?如何让Java rest api调用立即不返回等待?

+0

启动'somefunction()'在其他'thread'上 – Jerry06

+0

RxJava用于那个 – xenteros

回答

2

变线

somefunction(); 

new Thread() 
{ 
    public void run() { 
     somefunction(); 
    } 
}.start(); 
1

您应该使用RxJava您提供的承诺。你将有DefferedResult这将异步返回,所以它不会阻止其他方法执行。

例如:

@RequestMapping("/getAMessageFutureAsync") 
public DeferredResult<Message> getAMessageFutureAsync() { 
    DeferredResult<Message> deffered = new DeferredResult<>(90000); 
    CompletableFuture<Message> f = this.service1.getAMessageFuture(); 
    f.whenComplete((res, ex) -> { 
     if (ex != null) { 
      deffered.setErrorResult(ex); 
     } else { 
      deffered.setResult(res); 
     } 
    }); 
    return deffered; 
} 

--Code source and tutorial

5

如果您使用的是Java 8中,您可以使用新的Executor类:

@RequestMapping(value = "/endpoint", method = RequestMethod.POST) 
public ResponseEntity<?> endpoint(@RequestBody final ObjectNode data, final HttpServletRequest request) { 
    Executors.newScheduledThreadPool(1).schedule(
     () -> somefunction(), 
     10, TimeUnit.SECONDS 
    ); 
    return new ResponseEntity<>(HttpStatus.ACCEPTED); 
} 

这将:

  1. 附表somefunction()延迟10秒后运行。
  2. 返回HTTP 202已接受(当您的POST端点实际上并未实际创建任何内容时,应该返回该值)。
  3. 经过10秒后运行somefunction()