このトピックでは、Javaランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。
背景
関数インスタンスのライフサイクルフックを設定すると、対応するライフサイクルイベントが発生するとFunction Computeがフックを呼び出します。 PHPランタイムでは、InitializerフックとPreStopフックを設定できます。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。
関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログ、リアルタイムログ、および高度なログでのみ照会できます。 ライフサイクルフックのログは、呼び出し要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
フックメソッドの署名
初期化フック署名
関数インスタンスが開始された後、ハンドラーが実行される前に、Initializerフックが実行されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 イニシャライザーフックの実行に失敗した場合、システムはイニシャライザーフックが正常に呼び出されるまでイニシャライザーフックを再試行し、ハンドラーを実行します。 Initializerフックを繰り返し再試行できるようにするには、Initializerフックを適切に設定します。
Initializerフックにはコンテキスト入力パラメーターのみが含まれており、イベントハンドラーと同じ方法で呼び出すことができます。
Initializerフックを使用するには、FunctionInitializerインターフェイスを継承し、インターフェイス内のinitialize
メソッドを実装する必要があります。 次のサンプルコードは、FunctionInitializerインターフェイスを定義する方法の例を示しています。
package com.aliyun.fc.runtime;
import java.io.IOException;
/**
* This is the interface for the initialization operation
*/
public interface FunctionInitializer {
/**
* The interface to handle a function compute initialize request
*
* @param context The function compute initialize environment context object.
* @throws IOException IOException during I/O handling
*/
void initialize(Context context) throws IOException;
}
PreStopフック署名
関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックを使用するには、PreStopHandlerインターフェイスを継承し、インターフェイス内のpreStop
メソッドを実装する必要があります。 次のサンプルコードは、PreStopHandlerインターフェイスを定義する方法の例を示しています。
package com.aliyun.fc.runtime;
import java.io.IOException;
/**
* This is the interface for the preStop operation
*/
public interface PreStopHandler {
/**
* The interface to handle a function compute preStop request
*
* @param context The function compute preStop environment context object.
* @throws IOException IOException during I/O handling
*/
void preStop(Context context) throws IOException;
}
例: StreamRequestHandler
package example;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;
import com.aliyun.fc.runtime.FunctionInitializer;
import com.aliyun.fc.runtime.PreStopHandler;
public class App implements StreamRequestHandler, FunctionInitializer, PreStopHandler {
@Override
public void initialize(Context context) throws IOException {
context.getLogger().info("initialize start ...");
}
@Override
public void handleRequest(
InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
context.getLogger().info("handlerRequest ...");
outputStream.write(new String("hello world\n").getBytes());
}
@Override
public void preStop(Context context) throws IOException {
context.getLogger().info("preStop start ...");
}
}
ライフサイクルフックの設定
Function Computeコンソールの使用
function Computeコンソールの関数詳細ページでライフサイクルフックを設定できます。 フックの形式は [パッケージ名].[クラス名]::[メソッド名]
です。FC次の図に例を示します。
上記の例では、Initializer Hookが
example.App::initialize
に設定されています。これは、example
パッケージのApp.javaファイル内のinitialize
メソッドが実装されていることを示します。PreStop Hookは
example.App::preStop
に設定されます。これは、example
パッケージのApp.javaファイル内のpreStop
メソッドが実装されていることを示します。
Serverless Devsの使用
Serverless Devsを使用する場合は、Initializer hook、PreFreeze hook、およびPreStop hookの設定をs.yaml
ファイルに追加します。
初期化フック
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerをfunctionに追加します。
PreStopフック
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStopをfunctionに追加します。
サンプルコード:
# ------------------------------------
# Official manual: https://manual.serverless-devs.com/user-guide/aliyun/#fc3
# Tips: https://manual.serverless-devs.com/user-guide/tips/
# If you have any questions, join the DingTalk group 33947367 for technical support.
# ------------------------------------
edition: 3.0.0
name: hello-world-app
access: "default"
vars: # The global variables
region: "cn-hangzhou"
resources:
hello_world:
component: fc3
actions:
pre-${regex('deploy|local')}:
- run: mvn package -DskipTests
path: ./
props:
region: ${vars.region}
functionName: "start-java-1xqf"
description: 'hello world by serverless devs'
runtime: "java8"
code: ./target/HelloFCJava-1.0-SNAPSHOT-jar-with-dependencies.jar
handler: example.App::handleRequest
memorySize: 128
timeout: 10
instanceLifecycleConfig: # The extension function
initializer: # The Initializer hook
handler: example.App::initialize
timeout: 60
preStop: # The PreStop hook
handler: example.App::preStop # The function handler
timeout: 60 # The timeout period.
Serverless DevsのYAML構文の詳細については、「Serverless Devsの一般的なコマンド」をご参照ください。
インスタンスライフサイクルフックのログを表示する
ライフサイクルフックのログは、[ログ] で表示できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、テスト機能タブをクリックします。テスト機能を選択し、を選択します。
[ログ] タブでは、関数呼び出しログとInitializerログを表示できます。 例:
2024-03-04 17:57:28FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69 2024-03-04 17:57:282024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer 2024-03-04 17:57:28FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69 2024-03-04 17:57:28FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69 2024-03-04 17:57:28FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
各関数インスタンスは一定期間キャッシュされ、すぐには破棄されません。PreStopフックのログをすぐに表示することはできません。 PreStopフックをすばやくトリガーするには、関数設定または関数コードを更新します。 更新が完了すると、関数ログでPreStopフックのログを表示できます。 次のサンプルコードは例を示しています。
2024-03-04 18:33:26FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031 2024-03-04 18:33:262024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop 2024-03-04 18:33:26FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b213031
サンプルプログラム
java11-mysql: Function Computeが提供するサンプルプログラム。 このプログラムでは、InitializerおよびPreStopフックの設定例を示します。
このプログラムでは、JavaランタイムのInitializerフックを使用して、環境変数からデータベース構成を取得し、MySQL接続を確立します。 PreStopフックは、MySQL接続を終了するために使用されます。