2016-12-01 128 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()