2016-12-01 24 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 yaylı denetleyicide bir uç nokta var. Bu son nokta çağrıldığında, doğrudan geri dönmek istiyorum, bitirmek için somefunction() beklemeyin. Bununla nasıl baş edeceğimi öğretebilir misin?Java dinlenme api çağrısı nasıl yapılır?

+0

'somefunction()' 'diğer' thread' – Jerry06

+0

'dan başlatmak için RxJava bunun için kullanılır. – xenteros

cevap

2

değişim çizgisi

somefunction(); 

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

kişinin size vaat sunduğu RxJava kullanmalıdır olmak. Eşzamansız olarak döndürülen DefferedResult olacaktır, bu nedenle başka yöntemlerin yürütülmesini engellemez. Örneğin

:

@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 kullanıyorsanız, yeni Executor sınıfları kullanabilirsiniz:

@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); 
} 

Bu yapacaktır:

  1. Çizelge somefunction(), 10 saniyelik bir gecikmeden sonra çalışır.
  2. Dönüş HTTP 202 Kabul edildi (POST son noktanız gerçekte hiçbir şey oluşturmadığında geri dönmeniz gereken şey).
  3. 10 saniye geçtikten sonra somefunction() çalıştırın.
İlgili konular