前言
函数计算(Function Compute)是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Table Store Stream是用于获取Table Store表中增量数据的一个数据通道,通过创建Table Store触发器,能够实现Table Store Stream和函数计算的自动对接,从而实现表格存储中的表数据发生变更时候定制化的自动处理。具体可以查看表格存储触发函数计算官方教程,但是该官方教程只有python版的代码示例,本教程展示java版的代码示例。
具体过程
表格存储传给函数event参数是cbor格式,格式如下:
{
"Version": "string",
"Records": [
{
"Type": "string",
"Info": {
"Timestamp": int64
},
"PrimaryKey": [
{
"ColumnName": "string",
"Value": formated_value
}
],
"Columns": [
{
"Type": "string",
"ColumnName": "string",
"Value": formated_value,
"Timestamp": int64
}
]
}
]
}
1, 参考函数计算java runtime教程, 创建一个java8 runtime的函数, 本教程使用的是jackson库, 其中有关cbor处理;
注意:所依赖的第三方包也要一并打包进来,参考java 函数计算使用自定义包
下面展示是相关配置和代码:
<dependencies>
<dependency>
<groupId>com.aliyun.fc.runtime</groupId>
<artifactId>fc-java-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-cbor</artifactId>
<version>2.8.8</version>
</dependency>
</dependencies>
package example;
import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.Credentials;
import com.aliyun.fc.runtime.StreamRequestHandler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
import com.fasterxml.jackson.databind.JsonNode;
public class HelloFC implements StreamRequestHandler {
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
throws IOException {
CBORFactory f = new CBORFactory();
ObjectMapper mapper = new ObjectMapper(f);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
JsonNode node = mapper.readTree(inputStream);
System.out.println("Version: " + node.get("Version"));
JsonNode records = node.get("Records");
if (records.isArray())
{
for (JsonNode record : records)
{
System.out.println("Type: " + record.get("Type"));
JsonNode Info = record.get("Info");
System.out.println("Timestamp: " + Info.get("Timestamp"));
JsonNode PrimaryKey = record.get("PrimaryKey");
if (PrimaryKey.isArray())
{
for (JsonNode objNode : PrimaryKey)
{
System.out.println(objNode.get("ColumnName") + ": " + objNode.get("Value"));
}
}
JsonNode Columns = record.get("Columns");
if (Columns.isArray())
{
for (JsonNode objNode : Columns)
{
System.out.println(objNode.get("Type") + " " + objNode.get("ColumnName") + ": " + objNode.get("Value") + " >>" + objNode.get("Timestamp"));
}
}
}
}
outputStream.write(new String("ok").getBytes());
}
2, 参考表格存储触发函数计算官方教程 创建对应的ots实例和表,并且配置该表的触发器是一个1中创建的函数,最后效果如下图所示:
3,使用表格存储客户端或者表格存储操作表代码往对应的表中进行数据操作;
本人最后显示效果如下:
需要配置函数的service日志能写入logstore,具体参考函数计算访问日志服务