2016-12-01 8 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の残りのAPI呼び出しの呼び出しをすぐに待って戻らないようにするには?

+0

他の 'thread'で' somefunction() 'を開始します – 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. をスケジュール012 10秒の遅延の後にを実行してください。
  2. HTTP 202 Accepted(POSTエンドポイントが実際にその場で何も作成しないときに返すべきもの)を返します。
  3. 10秒後にsomefunction()を実行してください。
関連する問題