Topik ini menjelaskan cara mengimplementasikan panggilan balik siklus hidup untuk instance fungsi dalam lingkungan runtime Java.
Informasi latar belakang
Setelah Anda mengonfigurasi panggilan balik siklus hidup untuk instance fungsi, Function Compute akan memanggil panggilan balik tersebut ketika peristiwa siklus hidup terkait untuk instance terjadi. Panggilan balik yang dapat dikonfigurasikan meliputi: Initializer, PreFreeze, dan PreStop. Lingkungan runtime Java mendukung semua panggilan balik tersebut. Untuk informasi lebih lanjut, lihat Siklus Hidup Instance Fungsi.
Aturan penagihan untuk panggilan balik siklus hidup instance fungsi sama dengan aturan penagihan untuk permintaan pemanggilan umum. Namun, log eksekusi hanya dapat diperiksa di Function Logs, Instance Logs, atau Advanced Logs. Log untuk panggilan balik siklus hidup tidak ditampilkan di Call Request List. Untuk informasi lebih lanjut, lihat Lihat Log Panggilan Balik Siklus Hidup Instance..
Tanda tangan metode
Initializer hook signature
Panggilan balik Initializer dijalankan setelah instance fungsi dimulai dan sebelum handler dijalankan. Function Compute memastikan bahwa panggilan balik Initializer dipanggil dengan sukses hanya sekali selama siklus hidup instance fungsi. Jika panggilan balik Initializer gagal dijalankan, sistem akan mencoba kembali hingga berhasil, kemudian menjalankan handler Anda. Pastikan bahwa panggilan balik Initializer dikonfigurasi dengan benar saat dipanggil berulang kali.
Panggilan balik Initializer memiliki parameter input context dan dapat dipanggil dengan cara yang sama seperti penanganan acara.
initialize dalam operasi tersebut harus diimplementasikan. Contoh kode berikut menunjukkan cara mendefinisikan operasi FunctionInitializer: package com.aliyun.fc.runtime;
import java.io.IOException;
/**
* Ini adalah antarmuka untuk operasi inisialisasi
*/
public interface FunctionInitializer {
/**
* Antarmuka untuk menangani permintaan inisialisasi Function Compute
*
* @param context Objek konteks lingkungan inisialisasi Function Compute.
* @throws IOException IOException selama penanganan I/O
*/
void initialize(Context context) throws IOException;
}PreStop hook signature
preStop dalam operasi tersebut harus diimplementasikan. Contoh kode berikut menunjukkan cara mendefinisikan operasi PreStopHandler: package com.aliyun.fc.runtime;
import java.io.IOException;
/**
* Ini adalah antarmuka untuk operasi preStop
*/
public interface PreStopHandler {
/**
* Antarmuka untuk menangani permintaan preStop Function Compute
*
* @param context Objek konteks lingkungan preStop Function Compute.
* @throws IOException IOException selama penanganan I/O
*/
void preStop(Context context) throws IOException;
}PreFreeze hook signature
preFreeze dalam operasi tersebut harus diimplementasikan. Contoh kode berikut menunjukkan cara mendefinisikan operasi PreFreezeHandler: package com.aliyun.fc.runtime;
import java.io.IOException;
/**
* Ini adalah antarmuka untuk operasi preFreeze
*/
public interface PreFreezeHandler {
/**
* Antarmuka untuk menangani permintaan preFreeze Function Compute
*
* @param context Objek konteks lingkungan preFreeze Function Compute.
* @throws IOException IOException selama penanganan I/O
*/
void preFreeze(Context context) throws IOException;
}Contoh: 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.PreFreezeHandler;
import com.aliyun.fc.runtime.PreStopHandler;
public class App implements StreamRequestHandler, FunctionInitializer, PreFreezeHandler, 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 preFreeze(Context context) throws IOException {
context.getLogger().info("preFreeze start ...");
}
@Override
public void preStop(Context context) throws IOException {
context.getLogger().info("preStop start ...");
}
}Konfigurasi panggilan balik siklus hidup
Use the Function Compute console
[Nama Paket].[Nama Kelas]::[Nama Metode]. Contoh:
- Jika Anda mengatur Initializer Hook ke
example.App::initialize, metodeinitializedi file App.java dari paketexamplediimplementasikan. - Jika Anda mengatur PreFreeze Hook ke
example.App::preFreeze, metodepreFreezedi file App.java dari paketexamplediimplementasikan. - Jika Anda mengatur PreStop Hook ke
example.App::preStop, metodepreStopdi file App.java dari paketexamplediimplementasikan.
Use Serverless Devs
s.yaml.- Konfigurasi Panggilan Balik Initializer
Tambahkan bidang initializer dan initializationTimeout ke parameter function.
- Konfigurasi Panggilan Balik PreFreeze
Tambahkan bidang instanceLifecycleConfig.preFreeze, termasuk handler dan timeout, ke parameter function.
- Konfigurasi Panggilan Balik PreStop
Tambahkan bidang instanceLifecycleConfig.preStop, termasuk handler dan timeout, ke parameter function.
Contoh kode:
edition: 1.0.0
name: hello-world # Nama proyek.
access: default # Alias kunci.
vars: # Variabel global.
region: cn-shanghai # ID wilayah.
service:
name: fc-example
description: 'contoh fc oleh serverless devs'
services:
helloworld: # Nama layanan atau modul.
component: fc
actions: # Logika eksekusi kustom.
pre-deploy: # Operasi sebelum penyebaran.
- run: mvn package # Perintah untuk dijalankan.
path: ./ # Jalur tempat perintah dijalankan.
props: # Nilai properti komponen.
region: ${vars.region}
service: ${vars.service}
function:
name: java8-lifecycle-hook-demo
description: 'contoh fc oleh serverless devs'
runtime: java8
codeUri: ./target
handler: example.App::handleRequest
memorySize: 128
timeout: 60
initializationTimeout: 60
initializer: example.App::initialize
instanceLifecycleConfig:
preFreeze:
handler: example.App::preFreeze
timeout: 30
preStop:
handler: example.App::preStop
timeout: 30Untuk informasi lebih lanjut tentang sintaks YAML Serverless Devs, lihat Perintah Serverless Devs.
Lihat log panggilan balik siklus hidup instance.
Anda dapat melihat log untuk panggilan balik siklus hidup di Function Logs.
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Services & Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Services, klik layanan yang diinginkan.
- Pada halaman Functions, klik nama fungsi yang diinginkan. Pada halaman Detail Fungsi yang muncul, klik tab Test Function.
- Pada tab Test Function, klik Test Function. Pilih .Pada tab Function Logs, Anda dapat melihat log pemanggilan, serta log untuk panggilan balik Initializer dan PreFreeze fungsi. Contoh:
2022-10-09 19:26:17 FunctionCompute dotnetcore3.1 runtime inited. 2022-10-09 19:26:17 FC Initialize Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize start 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle initializer: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize end 2022-10-09 19:26:17 FC Initialize End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 FC Invoke Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle request: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 FC Invoke End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 FC PreFreeze Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze start 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle PreFreeze: 793ad2f1-9826-4d9a-90d9-5bf39e****** 2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze end 2022-10-09 19:26:17 FC PreFreeze End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******Setiap instance fungsi disimpan dalam cache selama periode tertentu dan tidak langsung dihapus, sehingga Anda tidak dapat melihat log untuk panggilan balik PreStop segera. Untuk memicu panggilan balik PreStop dengan cepat, Anda dapat memperbarui konfigurasi fungsi atau kode fungsi. Setelah pembaruan selesai, Anda dapat melihat log untuk panggilan balik PreStop di Function Logs. Contoh:2022-10-09 19:32:17 FC PreStop Start RequestId: 03be685c-378b-4736-8b08-a67c1d***** 2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop start 2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] Handle PreStop: 03be685c-378b-4736-8b08-a67c1d***** 2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop end 2022-10-09 19:32:17 FC PreStop End RequestId: 03be685c-378b-4736-8b08-a67c1d*****
Program contoh
- Untuk informasi tentang program contoh pada panggilan balik Initializer dan PreStop yang disediakan oleh Function Compute, lihat java11-mysql.
Contoh ini menunjukkan cara menggunakan panggilan balik Initializer untuk mendapatkan konfigurasi database dari variabel lingkungan dan membuat koneksi MySQL, serta cara menggunakan panggilan balik PreStop untuk menutup koneksi MySQL dalam lingkungan runtime Java.