2016-12-01 5 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() { 
..... 
} 

जावा वसंत नियंत्रक में, मेरे पास एक एंडपॉइंट है। जब यह एंडपॉइंट कहा जाता है, तो मैं इसे सीधे वापस करना चाहता हूं, समाप्त करने के लिए somefunction() का इंतजार न करें। कोई मुझे सिखा सकता है कि इससे कैसे निपटें?जावा आराम एपीआई कॉल वापसी कैसे करें तुरंत प्रतीक्षा न करें?

+0

अन्य 'थ्रेड ' – Jerry06

+0

पर' कुछ कार्य()' शुरू करें RxJava का उपयोग उस के लिए किया जाता है – xenteros

उत्तर

2

परिवर्तन लाइन

somefunction(); 

होने की

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

आप RxJava का उपयोग करना चाहिए जो आप वादों प्रदान करता है। आपके पास होगा जो असीमित रूप से वापस कर दिया जाएगा, इसलिए यह अन्य विधियों को निष्पादित होने से अवरुद्ध नहीं करेगा।

उदाहरण के लिए:

@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

आप जावा 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 108 देरी के बाद चलाने के लिए।
  2. रिटर्न HTTP 202 स्वीकृत (जो आपको पोस्ट करना चाहिए जब आपका पोस्ट एंडपॉइंट वास्तव में स्पॉट पर कुछ भी नहीं बनाता है)।
  3. 10 सेकंड बीतने के बाद somefunction() चलाएं।
संबंधित मुद्दे