Chain Builder ESB心得之custom code
当我们在做chain Builder 流程配置时候,难免有一些现有的组件的功能无法满足我们的需要,而chain Builder 为我们提供了很好的自定义代码(custom code)功能,让我们在处理一些现有组件无法完成的功能时,能通过写自定义代码来实现。
建立自定义代码
1. 当我们的自定义代码是想在多个JBI 功能引用的,我们可以在ESB 工程中建立,而单独的作为一个JBI 工程的自定义代码,则在此JBI工程新建。
2. 界面分析
在工程右键新建-自定义代码,界面如上图所示,其中
2.1 类型:
˙Map User Operation --> 用于做映射时的自定义操作;
˙TrxID --> 从信息中获得或设置TrxID 并返回
˙Upoc --> 对终端消息链的自定义操作(如出错信息的监控)
˙Script Component --> 可以自定义脚本组件
˙Etl Error Handler --> 自定义ETL 组件的出错监控
2.2 语言:
˙java 完全支持java语言
˙Groovy 基于java 虚拟机的敏捷动态语言
实际应用介绍
1. Map User Operation 自定义代码
1.1 场景介绍:在做一次调用webServices返回一个附件信息(默认进行了base64 的编码),我们需要将附件映射到一个目标数据源中,需要对webServices返回的附件进行base64 的解码,将获得到的附件信息在保存到数据库中;
1.2 解决方案:在获得到webServices返回信息时候,映射时选择自定义操作,从而调用自定义代码,将webServices返回的附件信息,进行解码保存;自定义代码类名:StoreAttachmentFromByte
其核心代码如下:
public boolean process(String[] sources, Object[] sourcesDom,
Node[] targetDom, Object[] targets,
IMapOperationContext operationContext,
IMapExecutionContext mapContext) throws Exception {
if (sources.length > 0) {
if(sources.length > 1 && "false".equalsIgnoreCase(sources[1]))
{
logger.error("获得附件内容失败:"+mapContext.getMetadata("keyvalue"));
if(sources.length > 2)
{
logger.error("webservice返回出错信息:"+sources[2]);
}
return false;
}
//对webservice 返回的sources[0] 进行base64解码,返回一个byte数组
byte[] byteArry = Base64Util.decodeToByteArray(sources[0]);
String destCID = generateContentId();//生成一个附件ID
DataSource ds = new ByteArrayDataSource(byteArry,"application/octet-stream");
if (null != ds) {
DataHandler dh = new DataHandler(ds);
if (null != dh) {//将格式化的附件添加到目标数据中
mapContext.setTargetAttachment(destCID, dh);
targets[0] = destCID;
}
}
} else {
logger.error("No source argument provided:"+mapContext.getMetadata("keyvalue"));
return false;
}
return true;
}