2016-11-28 47 views
5

別のJava Lambda関数内からJava Lambda関数を非同期に呼び出そうとしています。私は単に発火して忘れたいですが、.invokeAsync(InvokeRequest)を使用して、将来の.get()を呼び出す必要があります。これにより、 'fire and forget'ユースケースがブロックされ、中断されます。ここで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は廃止され、それが「APIを呼び出す」を参照して述べています。

純粋に「ファイヤーアンドファー」のファッションでラムダ機能を呼び出す方法は誰にでも導きますか?

EDITマークの提案ごとに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日午前3時41分35秒INFOのLambdaFunction:97から1480304495867
2016年11月28日3時41分41秒INFOのLambdaFunction:99から1480304501432

違いがあります2つの間の約5.5秒のラムダ期間はこれを確認する。ただ、明確にする

EDIT 2 、私は.invokeAsync(InvokeRequest)を呼び出し、.invoke(InvokeRequest)と働いていないどちらもAWSLambdaAsyncClientをしようとしていました。 invokeAsyncを呼び出すと、その上で.get()を呼び出さない限り、実際にはLambda関数が呼び出されず、2番目のLambda関数が実行されている間にブロックされます。

最終的には.invokeAsync(InvokeRequest)を呼び出していましたが、InvokeRequestオブジェクトで.withInvocationType(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のJavadocは、すべてのサービスコールがブロックされると言っています。 – Brooks

+0

あなたはあなたの質問に 'AWSLambdaAsyncClient'を使用しているとは言及していませんでした。そのクラスのjavadocを見ると、 'invokeAsyncAsync()'のみが推奨されていません。使用している 'invokeAsync()'メソッドはうまくいくはずです。 http://docs.aws.amazon。com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/lambda/AWSLambdaAsyncClient.html –

+0

ごめんなさい。私はあなたの答えを介して正しい答えが得られましたが、何らかの理由でInvocationTypeをEventに設定すると、同期動作が発生しました。 – Brooks

関連する問題