对于通用的,Nature 封装了一些内建 Executor ,但这远远不能满足您业务上的需要,还需要您按照 Nature 给定的接口协议进行 Executor 开发并部署。当Executor部署完成后,还需要在 Relation 里定义这些 Executor,这样在运行时 Nature 才会调用这些 Executor。
Nature 目前有三种形式的 Executor:
- converter: 用于 Meta 间
Instance的转换。 - convert_before: 用于
Instance转换前的预处理,如数据格式的修正,数据加载等。 - convert_after: 用于转换后
Instance的后置处理。
这三种形式的 Executor 都可以在 Nature-Demo 项目中找到对应的示例。
其实从功能上讲 convert_before 和 convert_after 完全可以用 converter 形式来替换,但 Nature 不建议这样做,有下面的原因:
convert_before和convert_after一般只是技术上的处理,没有超出业务对象的范围,而converter则是衔接了两个业务对象,既超出了业务对象的范围。在管理界面上来讲,converter将来会用于业务对象关系的展示,但convert_before和convert_after是不会被直接展示的。- 从性能上讲
converter会有一个写库的过程,而convert_before,convert_after是不需要存储的,效率会更高,这在海量数据处理时影响较大。
目前 Nature 可以通过两种方式来调用Executor : http 和 localRust。后续可能会补充其它协议。
请用一种自己喜欢的语言来实现一个可处理POST请求的 Web 服务。并确保 Nature 可以按照 Relation 中 executor 属性定义的url访问到这个服务地址。
为本地 lib 包,这些包需要放置到 .env 配置文件 PLUGIN_PATH 属性指定的目录下或与 nature 可执行文件同级的目录下,注意:该目录不支持子目录的查找。如果本地 lib 包较多,为了更好的区分三种类型的 executor,建议lib文件的命名如下:
lib 所包含的Executor类型 |
建议前缀 | 示例 |
|---|---|---|
| convert_before | b_ | b_e-mall |
| convert_after | a_ | a_e-mall |
| converter | c_ | c_e-mall |
包含多种类型的Executor |
m_ | m_e-mall |
注意:
-
请保证 lib 文件名与 Relation 中定义的名称一致。
-
Relation 中对于 lib 包的定义可以不用包含扩展名。
下面为本地包的生成方法参考:
用 Rust 创建一个 lib 项目。cargo.toml 需要包含类似于下面的内容。
[lib]
name="your_lib"
crate-type = ["cdylib"]方法实现请参考下面的模板,使用时替换掉 T 和 R 即可
#[no_mangle]
#[allow(improper_ctypes_definitions)]
pub extern fn your_func<T,R>(para: T) -> R {
// your logic
}以下面的 converter 接口为例
#[no_mangle]
#[allow(improper_ctypes_definitions)]
pub extern fn order_should_pay(para: ConverterParameter) -> ConverterReturned {
// your logic
}入参为数据定义里的 ConverterParameter, 出参为数据定义里的 ConverterReturned,
入参为 Instance, 出参为 Result<Instance>,请见数据定义里的 Instance,出参的 json 形式如下:
-
正常情况下请输出下面的内容,Ok 的值为改变后的
instance对象,{"Ok":{}} -
如果处理过程中遇到问题,则返回下面的内容:
{"Err":{"LogicalError":"err message"}}或
{"Err":{"EnvironmentError":"err message"}}
入参为Vec<Instance>, 出参为 Result<Vec<Instance>>,请见数据定义里的 Instance,出参的 json 形式如下:
-
正常情况下请输出下面的内容,Ok 的值为改变后的
instance对象数组。{"Ok":[]} -
如果处理过程中遇到问题,请参考
convert_before的问题处理方式