为了降低熟练使用 Java 的用户接入腾讯轻联的门槛,Dataway 代码模式提供对 Java 脚本的支持。
对于任意 Dataway 编辑文本框,将鼠标移至文本框,会自动弹出模式选择按钮,单击代码进入代码模式。
单击编辑文本框,弹出代码编辑器,单击Java,进入 Java 脚本编辑器。
编辑完成后,单击确定进行保存。
代码模式 Java 支持 集成流数据面板引用。
Java 脚本需符合 JDK8 语法规定。
类名必须为 Handler,且必须定义一个签名为 Object eval(Message msg) 的函数作为入口函数。
import
com.tencent.ipaas.dataway.common.message.Message;
import
com.tencent.ipaas.dataway.common.message.DataRef;
不能删除,其它 import 语句可以根据类型使用需求在下面新增。
// 这行 import 固定,不能删除
import
com.tencent.ipaas.dataway.common.message.Message;
import
com.tencent.ipaas.dataway.common.message.DataRef;
/**
* dataway-java入口类,名称必须为 Handler
*/
public
class
Handler {
/**
* 入口函数,签名必须为 Object eval(Message msg)
* @param
msg 输入 Message 对象
* @return 任意 dataway 支持的数据对象
*/
public
Object eval(Message
msg)
{
return
msg.getPayload();
}
}
代码模式 Java 对各数据类型提供充足支持,方便用户对各数据类型进行操作。
类型名 | 类型描述 | 对应 Python 类型 | 类型举例 | 类型方法 |
---|---|---|---|---|
null | Java 中的空值 null | None | null | 略 |
String | 字符串,即 Java 原生的字符串 String | str | “abc” | 略 |
Boolean | 布尔值,即 Java 原生布尔值 bool | bool | true/false | 略 |
float/Float | 浮点数,即 Java 原生浮点数 float | float | 123.456 | 略 |
int/Integer | 整数,即 Java 原生整型 int | int | 123 | 略 |
long/Long | 长整数,即 Java 原生长整型 Long | 123L | 略 | |
short/Short | 短整数,即 Java 原生短整型 Short | 123 | 略 | |
byte[] | 字节数组,即 Java 字节数组类型 byte[] | bytes | byte[]{1,2,3} | 略 |
java.util.List | 列表,序列类型容器,即 Java 原生 List 类型 | list | new java.util.ArrayList<>() | 详情可参考 官方文档 |
java.util.Map | 字典,kv 类型容器,即 Java 原生 Map 类型 | dict | new java.util.HashMap<>() | 详情可参考 官方文档 |
java.time.OffsetDateTime | 时间,即 Java 原生的 OffsetDateTime | datetime.datetime | java.time.OffsetDateTime.now() | 详情可参考 官方文档 |
java.time.LocalDate | 日期,即 Java 原生的 LocalDate | datetime.date | java.time.LocalDate.now() | 详情可参考 官方文档 |
java.time.OffsetTime | 时钟,即 Java 原生的 OffsetTime | datetime.time | java.time.OffsetTime.now() | 详情可参考 官方文档 |
java.math.BigDecimal | 十进制数,即 Java 原生的 BigDecimal | decimal.Decimal | new java.math.BigDecimal("1") | 详情可参考 官方文档 |
com.tencent.ipaas.dataway.common.message.Entity(轻联特有类型) | 即轻联中的实体数据,用于代表一个二进制对象,以 Entity 类型进行访问,包括blob、mimeType、encoding 等信息 | Entity | HTTP-listener 构造消息中的 payload | 详见“使用 Entity 对象” |
com.tencent.ipaas.dataway.common.message.Multimap(轻联特有类型) | 多值 map,类似于 xml 而与 dict 不同,该类型可以支持重复的 key,继承自 HashMap<String, List> | MultiMap | application/www-form-urlencoded 格式的数据解析之后得到的对象 | 构建方法:Multimap(Map dict) |
构建静态方法:Multimap fromSetEntry(Set<Map.Entry> set) | ||||
获取特定键对应的第一个值:Object getFirst(Object key) | ||||
获取特定键对应的所有值组成的列表:List getAll(Object key) | ||||
获取键值对集合:Set<Map.Entry> toSetEntry() | ||||
继承自 HashMap 的方法 | ||||
com.tencent.ipaas.dataway.common.message.FormDataParts(轻联特有类型) | 数组+列表的数据结构,类似于 Python 中的 orderDict 结构,继承自 LinkedHashMap<String, Object> | FormDataParts | multipart/form-data 格式的数据解析后得到的对象 | 构建方法:FormDataParts(String boundary) |
获取特定关键词对应值(当关键词为 int /long时,关键词作为键的序号;其余情况,关键词即为键):Object get(Object key) | ||||
继承自 LinkedHashMap 的方法 | ||||
com.tencent.ipaas.dataway.common.message.Message(轻联特有类型,不可通过 dataway 构建) | 即轻联中的集成流消息,以 Message 类型进行访问 | Message | public Object eval(Message msg) 入口函数中的 msg 参数 | 获取 payload:Object getPayload() |
获取 Attributes:Map getAttrs() | ||||
获取 Variables:Map<Object, Object> getVars() 或者 Object getVar(String name) | ||||
获取 Error:DataWayError getError() | ||||
com.tencent.ipaas.dataway.common.message.DataSet(轻联特有类型,不可通过 dataway 构建) | 数据集成中的数据集,通过数据集成组件生成 | RecordSet | Builder 组件的输出 | 获取 id:Long getId() |
获取 schema:Schema getSchema() | ||||
获取 partitions:Long getPartitions() | ||||
com.tencent.ipaas.dataway.common.message.Record(轻联特有类型,不可通过 dataway 构建) | 数据集成中的单条数据,附有 schema | Record | 可通过 Foreach 组件遍历 DataSet 获取 | 获取所有数据:List getData() |
获取 schema:Schema getSchema() | ||||
获取特定关键词对应数据(当关键词为 int / long时,关键词为列序号;其余情况,关键词为字段名):Object get(Object key) | ||||
是否包含字段名:boolean contains(String name) | ||||
获取字段名迭代器:Iterator<String> getIterator() | ||||
com.tencent.ipaas.dataway.common.message.Schema(轻联特有类型,不可通过 dataway 构建) | 数据集成中的数据字典,描述数据的元信息 | Schema | 可通过 Record 的 getSchema() 方法获取,对应于各项数据 | 获取所有字段信息:RecordField[] getFields() |
获取特定字段名对应字段信息:RecordField getField(String name) | ||||
转化为类似 {"Fields":[{"Name":"name","Type":"string"}]} 的字典形式:Map<?,?> toMap() | ||||
com.tencent.ipaas.dataway.common.message.RecordField(轻联特有类型,不可通过 dataway 构建) | 数据集成中的字段信息,描述单个字段的元信息 | Schema | 可通过 Schema 的 getField(name) 方法获取 RecordField | 获取字段名:String getName() |
获取字段类型:String getType() |
在代码模式 Java 中, 用 Entity 类型来表示轻联集成流中的实体数据,表示二进制数据的封装对象,其主要组成部分包括 blob、mimeType 以及 encoding。
组成部分 | 说明 | |
---|---|---|
blob | 原始的二进制数据。 | |
mimeType | 表示二进制数据的内容格式,例如:application/json、application/www-form-urlencoded | multipart/form-data 等。 |
encoding | 表示二进制数据的字符编码格式,例如:utf-8、gbk 等。 |
可以通过如下方式访问 Entity 中的内容:
访问方式 | 说明 |
---|---|
byte[] getBlob() | 获取该消息对象的负载数据,返回 byte[] 类型的对象。 |
String getMimeType() | 获取该消息对象的 MIME 类型,返回 String 对象。 |
String getEncoding() | 获取该消息对象的编码类型,返回 String 对象。 |
Object getValue() | 根据 MIME 类型和编码类型,对负载数据 blob 进行反序列化,并返回其结果,该类型为代码模式 Java 类型系统中定义的类型之一。 |
Object get(Object key) | 根据 MIME 类型和编码类型对 message 的内容进行反序列化,并获取其中指定 key 的值。 |
当前反序列化支持的 MIME 类型及其反序列化后的值类型如下:
text/plain → String
application/json → Object,与 GSON 一致
application/x-www-form-urlencoded → Multimap
application/xml → Map
application/csv → List<Map<String,String>>,即字段名与取值映射的列表
multipart/form-data → FormDataParts
用于将值类型 data 封装为 Entity 类型,并返回。如下所示:
Entity.fromValue(Object value, String mimeType, String encoding)
在 fromValue 函数内部,会先根据给定的 MIME 类型和编码类型尝试对 value 进行序列化得到 byte 类型的数据,然后再封装为 Entity 类型进行返回。
mimeType 参数必传,且目前支持的 MIME 类型有 text/plain、application/json、application/x-www-form-urlencoded、application/csv、 application/xml 和 multipart/form-data 六种。
encoding 参数必传,且支持任意合法的编码类型。
用于将 String 或者 byte 类型数据封装为 Entity 类型,并返回。如下所示:
Entity.fromBytes(Object data, String mimeType, String encoding)
fromBytes 函数中的 MIME 类型和编码类型参数校验规则与 fromValue 函数相似,不同的是不会对 MIME 类型的参数值进行限制,可以为任意的 MIME 类型。
如果传递给 fromBytes 函数的 data 参数类型为 byte[] 类型,该函数会直接返回一个以 data、mimeType、encoding 作为参数构造的 Entity 对象。
如果传递的 data 是 String 数据,则会尝试根据 encoding 参数将其编码为 byte[] 类型,并构造成 Entity 对象。
Entity 对象在本质上是一个对二进制数据的封装对象,为方便使用,提供 entity.get() 等访问对象内容的方法。在使用这些功能时,需要注意的是,有些特殊操作下系统会尝试先对 Entity 中的二进制数据进行反序列化解析,如果解析失败则会导致运行时错误。这些特殊操作包括:
用 entity.getValue() 来获取解析后的结构化结果。
用 entity.get(key) 来获取结构化结果中的某项内容。
在不符合条件的 Entity 对象上执行上述特殊操作,将会导致运行时错误。