全部产品
云市场

Java Initializer 函数

更新时间:2020-03-31 14:34:38

本文介绍了 Java Initializer 函数结构信息,Initializer 函数是实例的初始化函数,保证同一实例成功且仅成功执行一次。

Initializer 函数示例

无论您的函数使用流式输入还是通过泛型的方式自定义输入和输出,当需要在 Java runtime 中添加 initializer 接口时,都需要在原有的基础上额外实现 initializer 预定义的接口。

initializer 函数预定义接口如下所示。

  1. package com.aliyun.fc.runtime;
  2. import java.io.IOException;
  3. public interface FunctionInitializer {
  4. /**
  5. * The interface to handle a function compute initialize request
  6. *
  7. * @param context The function compute initialize environment context object.
  8. * @throws IOException IOException during I/O handling
  9. */
  10. void initialize(Context context) throws IOException;
  11. }

一个简单的流式输入的函数和 initializer 函数结合的示例如下所示。

  1. package aliyun.serverless.test.example;
  2. import com.aliyun.fc.runtime.Context;
  3. import com.aliyun.fc.runtime.FunctionComputeLogger;
  4. import com.aliyun.fc.runtime.StreamRequestHandler;
  5. import com.aliyun.fc.runtime.FunctionInitializer;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. public class InitializerAndStreamRequest implements StreamRequestHandler, FunctionInitializer {
  10. @Override
  11. public void initialize(Context context) {
  12. FunctionComputeLogger logger = context.getLogger();
  13. logger.debug(String.format("RequestID is %s %n", context.getRequestId()));
  14. }
  15. @Override
  16. public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
  17. FunctionComputeLogger logger = context.getLogger();
  18. logger.debug(String.format("RequestID is %s %n", context.getRequestId()));
  19. output.write(new String("hello world!").getBytes());
  20. output.flush();
  21. }
  22. }

针对 InitializerAndStreamRequest 中新增加的 initializer 方法即是 initializer 接口,有以下特性:

  • 包名/类名

    initializer 所属包名和类名和事件函数一致,都可以是任意的。initializer 的格式同为 {package}.{class}::{method},与 handler 不同的是 handler 中的方法为 handleRequestinitializer 的方法为 initialize。根据定义可知此示例的 initializer 为 aliyun.serverless.test.example.InitializerAndStreamRequest::initialize

  • 实现的接口

    您的代码中必须要实现函数计算预定义的接口。上文示例中 initializer 接口实现了 FunctionInitializerinitializer 接口只有一个 context 参数。

  • context 参数context 参数中包含一些函数的运行时信息(例如 requestId、临时 AccessKey 等),其类型是 com.aliyun.fc.runtime.Context

  • 返回值

    实现 FunctionInitializer 接口的函数没有返回结果。

泛型的方式输入的函数和 initializer 函数结合的示例如下所示。

  1. package aliyun.serverless.test.example;
  2. import com.aliyun.fc.runtime.Context;
  3. import com.aliyun.fc.runtime.PojoRequestHandler;
  4. import com.aliyun.fc.runtime.FunctionInitializer;
  5. import com.aliyun.fc.runtime.FunctionComputeLogger;
  6. public class InitializerAndPojoRequest implements FunctionInitializer,PojoRequestHandler<SimpleRequest, SimpleResponse> {
  7. @Override
  8. public void initialize(Context context) {
  9. FunctionComputeLogger logger = context.getLogger();
  10. logger.debug(String.format("RequestID is %s %n", context.getRequestId()));
  11. }
  12. @Override
  13. public SimpleResponse handleRequest(SimpleRequest request, Context context) {
  14. FunctionComputeLogger logger = context.getLogger();
  15. logger.debug(String.format("RequestID is %s %n", context.getRequestId()));
  16. String message = "Hello, " + request.getFirstName() + " " + request.getLastName();
  17. return new SimpleResponse(message);
  18. }
  19. }