本文介绍Java事件请求处理程序的结构特点和示例。

处理程序接口

您在使用Java编程时,必须要实现函数计算提供的接口类,fc-java-core库为事件请求处理程序定义了以下两个接口。

  • StreamRequestHandler

    以流的方式接收输入的event事件并返回执行结果。您需要从输入流中读取调用函数时的输入,处理完成后把函数执行结果写到输出流中来返回。

  • PojoRequestHandler

    以泛型的方式接收输入的event事件并返回执行结果。您可以自定义输入和输出的类型,但是输入和输出的类型必须是POJO类型。

StreamRequestHandler

一个最简单的StreamRequestHandler示例如下所示。

package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class HelloFC implements StreamRequestHandler {

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        outputStream.write(new String("hello world").getBytes());
    }
}           
  • 包名和类名

    由于Java有包的概念,因此执行方法和其他语言有所不同,需要包含包的信息。代码示例中请求处理程序(handler)为example.HelloFC::handleRequest,其中example标识为包名,HelloFC标识为类名,handleRequest标识为类方法。

    说明 包名和类名可以是任意的,但是需要与函数配置信息中的请求处理程序字段相对应。关于请求处理程序的设置,请参见创建函数
  • 实现的接口

    您的代码中必须要实现函数计算预定义的接口。上述的代码示例中实现了StreamRequestHandler,其中的inputStream参数为调用函数时传入的数据,outputStream参数用于返回函数的执行结果。

  • Context参数

    Context参数中包含一些函数的运行时信息(例如RequestId、临时AccessKey等),其类型是com.aliyun.fc.runtime.Context。具体信息,请参见上下文

  • 返回值

    实现StreamRequestHandler接口的函数通过outputStream参数返回执行结果。

  • 引入接口库
    其中用到的com.aliyun.fc.runtime包的依赖可以通过下文的pom.xml引用。
    <dependency>
        <groupId>com.aliyun.fc.runtime</groupId>
        <artifactId>fc-java-core</artifactId>
        <version>1.4.1</version>
    </dependency>           

    您可以通过Maven仓库获取fc-java-core最新的版本号。

在创建函数之前,您需要将代码和其依赖的fc-java-core打包为JAR格式的压缩包。打包方式,请参见编译部署代码包

PojoRequestHandler

一个最简单的PojoRequestHandler示例如下所示。SimpleRequest的对象需支持JSON序列化,例如POJO。

// HelloFC.java
package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;

public class HelloFC implements PojoRequestHandler<SimpleRequest, SimpleResponse> {

    @Override
    public SimpleResponse handleRequest(SimpleRequest request, Context context) {
        String message = "Hello, " + request.getFirstName() + " " + request.getLastName();
        return new SimpleResponse(message);
    }
}            
// SimpleRequest.java
package example;

public class SimpleRequest {
    String firstName;
    String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public SimpleRequest() {}
    public SimpleRequest(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}            
// SimpleResponse.java
package example;

public class SimpleResponse {
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public SimpleResponse() {}
    public SimpleResponse(String message) {
        this.message = message;
    }
}            

传入的event参数示例如下。

{
  "firstName": "FC",
  "lastName": "aliyun"
}            

示例程序

函数计算官方库包含了使用各种处理程序类型和接口的示例应用程序。每个示例应用程序都包含用于轻松编译部署的方法。例如: