2016-12-01 2 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 call return немедленно не ждать?

+0

start '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 фактически ничего не создает на месте). Заброс somefunction() после прорыва по правому флангу.