2015-07-09 9 views
7

का उपयोग करते हुए असिंक एपीआई मैं एपीआई बिल्डिंग पर काम कर रहा हूं जो संभावित रूप से प्रति सेकेंड की उच्च संख्या में अनुरोध कर सकता है, और कुछ अनुरोधों में बहुत अधिक गणना (जटिल रिपोर्ट) की आवश्यकता हो सकती है। मुझे अवधारणा के सबूत के रूप में एक छोटा प्रोटोटाइप एक साथ रखने के लिए कहा गया है। मैं अपने जेएक्स-आरएस कार्यान्वयन के रूप में जर्सी के साथ स्प्रिंग बूट का उपयोग कर रहा हूं। अतीत में मैंने स्प्रिंग एमवीसी के साथ ऐसा कुछ किया है।स्प्रिंग + जर्सी

@RequestMapping(value = "/dashboard", method = RequestMethod.GET) 
public DeferredResult<String> showDashboard(Model model) { 
    DeferredResult<String> result = new DeferredResult<>(); 
    model.addAttribute("testObj", new User()); 
    result.setResult("home/dashboard"); 
    return result; 
} 

मैंने जर्सी के साथ यह कोशिश की और काम करने लगते हैं, या कम से कम यह एक त्रुटि नहीं फेंक दिया।

@GET 
    public DeferredResult<String> getClients() { 
     DeferredResult<String> deferredResult = new DeferredResult<>(); 
     deferredResult.setResult("Nothing! But I'm Async!"); 
     return deferredResult; 
    } 

हालांकि जर्सी में अतुल्यकालिक संचालन को संभालने के लिए मैंने जो भी उदाहरण देखे हैं, वे इस तरह दिखते हैं।

Produces(MediaType.TEXT_PLAIN) 
public void get(@Suspended final AsyncResponse response) { 
    // This call does not block. 
    client.callExternalService(
    // This callback is invoked after the external service responds. 
    new Callback<string>() { 
     public void callback(String result) { 
     response.resume("Result: " + result + ".n"); 
     } 
    }); 
} 

मेरा मुख्य सवाल पर्दे के पीछे क्या इन तीन कोड के टुकड़े के बीच का अंतर है, अगर वहाँ भी किसी भी है। क्या ये सब एक ही चीज़ पूरा करेंगे?

क्या एसिंक को पूरा करने का कोई बेहतर तरीका है? मैंने जावा में भविष्य का उपयोग भी देखा है, लेकिन इसका कभी भी उपयोग नहीं किया।

अद्यतन:

मैं अपने जर्सी नियंत्रक में निम्न कोड है जो सभी काम कर रहा है।

@GET 
    public String getClients() { 
     return "Nothing, I'm Sync!"; 
    } 

    @GET 
    @Path("/deferred") 
    public DeferredResult<String> getClientsAsync() { 
     DeferredResult<String> deferredResult = new DeferredResult<>(); 
     deferredResult.setResult("Nothing! But I'm Async!"); 
     return deferredResult; 
    } 

    @GET 
    @Path("/async") 
    public void getClientsJAXRSAsync(@Suspended AsyncResponse response) { 
     new Thread(() -> { 
      response.resume("I am Async too! But I am using @Suspended"); 
     }).start(); 
    } 

जो मेरे मुख्य प्रश्न पर वापस जाता है, इनके बीच क्या अंतर है? मेरी समझ है DeferredResult एक वसंत चीज है इसलिए यह सुनिश्चित नहीं है कि जर्सी के साथ उपयोग करने के लिए उपयुक्त है, हालांकि मैं जर्सी + वसंत का उपयोग कर रहा हूं।

+0

यह मेरे पोस्ट किए गए प्रश्न में से एक है। इसे देखें .. http://stackoverflow.com/questions/29563475/null-pointer-exception-in-resteasy-asynchronous-request नोट: मैंने अभी भी परीक्षण नहीं किया है कि प्रस्तावित उत्तर काम कर रहा है .. –

उत्तर

-3

आपकी समझ बिल्कुल सही है। दोनों एक ही काम कर रहे हैं। लेकिन कार्यान्वयन अलग हैं। DeferredResult वसंत कार्यान्वयन है। और आपके कोडबेस में अधिकांश भाग जेएक्स-आरएस कार्यान्वयन का है। मुझे यकीन नहीं है कि आपको मुट्ठी सेवा से प्रतिक्रिया मिल रही है।

लेकिन मेरी राय है, या तो आप वसंत वर्ग या जेएक्स-आरएस का उपयोग करते हैं। लेकिन दोनों एक ही विधि में नहीं।

+0

पहले दो विधियां असीमित नहीं हैं, वे क्लाइंट साइड (अनुरोध सेटिंग्स के प्रकार के आधार पर) पर असीमित हो सकती हैं, लेकिन यह बैकएंड पर पूरी तरह से तुल्यकालिक है जब तक कि विधि निष्पादन पूरा नहीं कर लेती है। ओपी पोस्ट की गई तीसरी विधि असली सर्वर पक्ष असीमित प्रक्रिया का एक उदाहरण है .. –

संबंधित मुद्दे