前言
函数计算(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,具体参考函数计算访问日志服务