在CPI的开发过程中,有时候需要处理大批量的数据报文,在这个过程中,由于复杂的流程,可能会需要将这些大批量数据先暂存起来,用于后续节点中使用,在前期开发过程中,我们将数据保存在Property或者Header中,当数据量少的时候,访问Property中存储的数据无疑效率是最快的,但是当数据量过大时,这种方式会占用大量的额外内存,可能会导致CPI由于运行时内存不足而导致运行失败,而将数据绑定在Header中,当发起一些Http请求时,由于会连带着Header一同发送,会因为绑定的属性过多而失败,所以在数据量过大的场合,我们可以考虑借助CPI提供的数据存储功能DataStore将数据存储起来,方便后续节点访问。
首先简单说明下CPI中数据共享的几种方式的差异:
Data Store | 仅支持XML格式内容存储,占用租户存储空间,上限32GB,提供创建,查询,删除控件。 |
Write Variable | 可以支持任何格式内容的存储,占用租户存储空间,只能手动去监控台删除,或者在一定时间后自动删除。 |
Property | 数据量少的场景下的最优选择,访问效率最快。 |
Header | 除了通过ProcessDirect控件进行数据传递时,其他情况下不建议将数据保存在Header中,可能会因为存储内容过多导致请求超载,一般Header中最大可存储4MB内容。 |
在同一集成流当中,进行数据共享,可以通过Data Store,Write Variable,Property,Header。
在不同集成流当中,进行数据共享,只能通过Data Store,Write Variable这两种方式。
下面简单介绍Data Store包含的四个控件的使用方式。
第一步,创建报文内容,仅支持XML格式内容:
第二步,使用Write控件进行数据存储:
Data Store Name:相当于数据库表名,最大长度40位,首位必须为字母且只能使用aA-zZ,0-9,-_.~字符,可以通过${header.headername}或者${property.propertyname}动态指定。
Visibility:访问范围,可选仅当前集成流可访问,或者全局集成流可访问。
Entry ID:相当于同一表中不同条目数的唯一区别标识,不填时则会自动生成一个GUID作为标识,可通过${header.headername}或者${property.propertyname}或者${xpath.node}动态指定。
Retention Threshold for Alerting (in d):填写天数前必须访问,否则该条目会被标记为丢弃状态。
Expiration Period (in d):填写天数后会自动删除,默认30天,最大180天,且必须大于访问天数。
Encrypt Stored Message:是否内容加密。
Overwrite Existing Message:是否覆盖已存在的内容。
Include Message Headers:是否包含Header内容。
第三步,通过Sequential Multicast控件,顺序执行存储功能,模拟循环多次存储数据操作:
第四步,使用Select控件获取所有数据:
Data Store Name:存储时填写的数据库表名。
Visibility:与存储时选项相同即可。
Number of Polled Messages:可获取条目数,假如存储了10个条目,这里维护5,则会获取到最后存储的5个条目。
Delete On Completion:当命中符合条件的数据后删除该记录。
获取结果:
第五步,使用Get控件获取指定EntryID的单条数据:
Entry ID:指定条目ID。
Throw Exception on Missing Entry:未获取到指定条目时是否抛出异常。
获取结果:
第六步,使用Delete控件删除指定条目:
删除结果:
可以看到,testID1的条目已被删除,只剩testID2的条目。
tips:当数据量过大时,可能会出现timeout的情况,需要调整下图所示参数,最大只支持12小时。
以上为关于DataStore控件所有使用方式的介绍。