2016-11-28 21 views
5

के लिए प्रतिस्थापन मैं जावा लैम्ब्डा फ़ंक्शन को अन्य जावा लैम्ब्डा फ़ंक्शन के भीतर से असंकालिक रूप से कॉल करने का प्रयास कर रहा हूं। मैं बस आग लगाना और भूलना चाहता हूं, लेकिन .invokeAsync (InvokeRequest) के साथ, मुझे भविष्य पर .get() को कॉल करना होगा, जो तब 'आग और भूल' केस को ब्लॉक और तोड़ देता है।AWS Lambda invokeAsync (बहिष्कृत)

यहाँ कोड मैं उपयोग करने के लिए कोशिश कर रहा हूँ है:

private void sendToDownloader(String payload) throws InterruptedException, ExecutionException { 
    log.info(payload); 
    InvokeRequest invoke = new InvokeRequest(); 
    invoke.withFunctionName("LambdaTwo") 
      .withPayload(payload) 
      .withInvocationType(InvocationType.Event); 

    lambdaClient.invokeAsync(invoke).get(); 
} 

अगर मैं .Get() विधि कॉल निकालने के लिए, यह वास्तव में LambdaTwo आह्वान नहीं करता है।

यह ध्यान दिया जाना चाहिए, यह लैम्ब्डा फ़ंक्शन LambdaTwo को आमंत्रित करने के तुरंत बाद समाप्त होता है।

इस बीच, मैं निम्नलिखित कोड का उपयोग कर की कोशिश की:

private void sendToDownloader(String payload) throws InterruptedException, ExecutionException { 
    log.info(payload); 
    InvokeAsyncRequest invoke = new InvokeAsyncRequest(); 
    invoke.withFunctionName("LambdaTwo") 
      .withInvokeArgs(payload); 

    lambdaClient.invokeAsync(invoke); 
} 

इस कोड काम करता है, फिर भी .invokeAsync बहिष्कृत हो गई है और यह देखने के लिए "एपीआई आह्वान", जिसके लिए मैं किसी भी प्रलेखन नहीं मिल सकता है कहते हैं।

क्या कोई मुझे पूरी तरह से 'आग और भूल' फैशन में लैम्ब्डा फ़ंक्शन का आह्वान करने के लिए सही तरीके से ले जा सकता है?

संपादित करें 1 प्रति मार्क के सुझाव, मैं नीचे दिए गए कोड को पुनः लिखा है, लेकिन यह LambdaTwo फ़ंक्शन निष्पादित करते हुए ब्लॉक करने के लिए लगता है।

public void routeEvent(String lambdaName, String cacheName) throws InterruptedException, ExecutionException, JsonProcessingException { 
    ObjectNode obj = new ObjectNode(JsonNodeFactory.instance); 
    obj.put("nodeName", cacheName); 
    InvokeRequest invoke = new InvokeRequest(); 
    invoke.withFunctionName(lambdaName) 
      .withInvocationType(InvocationType.Event) 
      .withPayload(OBJECT_MAPPER.writeValueAsString(obj)); 

    log.info(System.currentTimeMillis()); 
    lambdaClient.invoke(invoke); 
    log.info(System.currentTimeMillis()); 
} 

यह निम्नलिखित मिलीसेकंड प्रिंट करता है।

2016-11-28 03:41:35 जानकारी LambdaFunction: 97 - 1480304495867
2016/11/28 03:41:41 जानकारी LambdaFunction 99 - 1480304501432

एक अंतर नहीं है दोनों और लैम्ब्डा अवधि के बीच लगभग 5.5 सेकंड की पुष्टि करता है।

संपादित 2 बस स्पष्ट करने के लिए, मैं AWSLambdaAsyncClient .invokeAsync (InvokeRequest) और .invoke (InvokeRequest) बुला कोशिश कर रहा था और न ही काम किया। InvocAsync को कॉल करते समय, यह वास्तव में लैम्ब्डा फ़ंक्शन को तब तक नहीं बुलाता जब तक कि मैं उस पर .get() को कॉल नहीं करता, जो तब दूसरे Lambda फ़ंक्शन निष्पादित करते समय ब्लॉक करता है।

आखिर में काम करने के लिए क्या काम किया गया था .invokeAsync (InvokeRequest), हालांकि इनवॉकरवेस्ट ऑब्जेक्ट पर इनवॉवेशन टाइप (InvocationType.Event) को कॉल नहीं किया गया। यह स्पष्ट नहीं है कि इसने अतुल्यकालिक व्यवहार क्यों किया, लेकिन यह वही काम करता है जो एक बहिष्कृत विधि का उपयोग नहीं करता है।

public void routeEventAsync2(String lambdaName, String cacheName) throws InterruptedException, ExecutionException, JsonProcessingException { 
    ObjectNode obj = new ObjectNode(JsonNodeFactory.instance); 
    obj.put("nodeName", cacheName); 
    InvokeRequest invoke = new InvokeRequest(); 
    invoke.withFunctionName(lambdaName) 
      .withPayload(OBJECT_MAPPER.writeValueAsString(obj)); 

    lambdaAsyncClient.invokeAsync(invoke); 
} 

उत्तर

3

इस विधि के बहिष्करण के संबंध में दस्तावेज भ्रमित है। वे क्या कहने की कोशिश कर रहे हैं AWSLambdaClient.invoke(request) का उपयोग करना है। प्रतिक्रिया के इंतजार किए बिना लैम्ब्डा फ़ंक्शन को आमंत्रित करने के लिए आपको अनुरोध ऑब्जेक्ट पर InvocationTypeEvent सेट करने की आवश्यकता होगी।

+0

तो, संपूर्ण AWSLambdaAsyncClient को बहिष्कृत किया गया है? AWSLambdaClient के लिए जावाडोक का कहना है कि सभी सेवा कॉल अवरुद्ध हो जाएंगे ... – Brooks

+0

आपने उल्लेख नहीं किया था कि आप अपने प्रश्न में 'AWSLambdaAsyncClient' का उपयोग कर रहे थे। उस वर्ग के लिए javadocs को देखते हुए यह कहता है कि केवल 'invokeAsyncAsync() 'को बहिष्कृत किया गया है। 'InvokeAsync()' विधि जिसका आप उपयोग कर रहे हैं ठीक होना चाहिए। http: //docs.aws.amazon।com/AWSJavaSDK/नवीनतम/javadoc/com/amazonaws/सेवाएं/lambda/AWSLambdaAsyncClient.html –

+0

क्षमा करें मुझे इसका उल्लेख करना चाहिए था। मुझे आपके उत्तर के माध्यम से सही उत्तर मिल गया, लेकिन कुछ कारणों से इवेंटेशन टाइप को इवेंट में सेट करने के परिणामस्वरूप तुल्यकालिक व्यवहार हुआ। – Brooks

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