自定义插件
插件注册
引入插件过程
- 将插件打成jar包并导入lib目录中(参见自定义函数的打包导包步骤)
插件公共配置
在commons.xml中定义需要使用的filter,提供主配置引用。
filter的属性配置。
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
id | 标识 | string | xxxFilter,插件声明定义id |
class | 实例 | string | XxxFilter,插件连接的处理类名 |
插件使用
插件接口实现
filters属性配置
- 此处引用的filter与filters中定义的filter在节点上存在明显差异,定义的filter只有parameter子节点,而此处无parameter子节点;
- 需要特别注意数据流向的配置,in代表输入流,out代表输出流,针对in、out存在不同的处理;
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
ref | 引用 | string | 引用已经定义好的filter对象,xxxFilter,插件定义的标识id |
type | 数据流向 | string | in、out |
field属性配置
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
tag | 标识 | string | filter中字段的标识,作为key存入上下文; |
etag | 特殊标志 | string | 一般针对特殊的filter处理时需要配置 |
value | 值 | string | 当前字段的值; |
type | 数据类型 | string | String , Int,Number(a,b) |
size | 数据长度 | Int | 数字 |
示例
该插件实现的业务:对一个二维报文解报和组报。譬如:
11$222$333&44$5555&666$77&888$99
可以通过分割&获得一维数组:
[11$222$333,44$5555,666$77,888$99]
再通过分割$获得二维数组:
[[11,222;333],[44,5555],[666,77],[888,99]]
插件代码编写
写完打包至lib。
package com.brilliance.eibs.core.service.instance.impl;
import com.brilliance.eibs.core.model.IFieldDef;
import com.brilliance.eibs.core.service.Context;
import org.slf4j.Marker;
public class TestFilter extends AbsFilter {
//解报的报文
private String splitString = "";
private String outEtag = "";
String[] splitStrs = null;
public void execute(Context context) {
this.logger.debug(String.valueOf(context), new Object[]{"#####TestFilter is running 正在运行######"});
context.setCurrentInstance(this);
if (getType().equals("in")) {
this.splitString = (String) context.getObject();
splitStrs = splitString.split("&");
}
super.execute(context);
if (getType().equals("out")) {
this.logger.debug(String.valueOf(context), new Object[]{"############TestPlugin分隔符报文组装############"});
context.setObject(this.splitString);
this.logger.debug(String.valueOf(context), new Object[]{"split config result: " + this.splitString});
} else {
this.logger.debug(String.valueOf(context), new Object[]{"#######TestFilter分隔符报文解析#########"});
}
this.logger.debug(String.valueOf(context), new Object[]{"############TestFilter has finished running############"});
}
public Object getFieldValue(IFieldDef iFieldDef) throws Exception {
this.logger.info(this.context.toString(), new Object[]{"解析etag的行为:" + iFieldDef.getEtag()});
return this.parseStr(iFieldDef.getEtag());
}
@Override
protected void packField(IFieldDef fieldDef, Object fieldValue) {
this.logger.info(String.valueOf(context), new Object[]{"组报etag的行为:" + fieldDef.getEtag()});
packMsg(fieldDef.getEtag(), (String) fieldValue);
}
//根据etag解报得到相应坐标值
public String parseStr(String etag) {
String[] etags = etag.split("-");
String splitOne = splitStrs[Integer.valueOf(etags[0])];
String[] splitOnes = splitOne.split("\\$");
return splitOnes[Integer.valueOf(etags[1])];
}
//组报
public void packMsg(String etag, String val) {
this.logger.info((Marker) context, outEtag + ";" + etag + ";" + val);
String[] etags = etag.split("-");
if (outEtag.equals("")) {
outEtag = etags[0];
splitString = val;
} else if (outEtag.equals(etags[0])) {
this.splitString = splitString + "$" + val;
} else {
outEtag = etags[0];
splitString = splitString + "&" + val;
}
}
}
插件注册
<filters>
<filter id="testFilter" class="TestFilter" />
</filters>
插件调用
<transaction id="3" version="2.0">
<step id="1">
<connection ref="fileConnection" type="in">
<property name="path" value="E:\ideaProject\xckj\Be_Dea_LX\Be_Dea_LX\msg\test3.txt" />
</connection>
<filter ref="testFilter" type="in">
<log value="输出:${this}"/>
<field tag="part1" etag="0-1"/>
<field tag="part2" etag="0-2"/>
<field tag="part3" etag="1-0"/>
<field tag="part4" etag="1-1"/>
<log value="part1:${part1};part2:${part2};part3:${part3};part4:${part4};"/>
</filter>
<filter ref="testFilter" type="out">
<field etag="0-0" value="${part1}"/>
<field etag="0-1" value="${part2}"/>
<field etag="0-2" value="33"/>
<field etag="1-0" value="qq"/>
<field etag="1-1" value="dd"/>
<field etag="2-0" value="99"/>
<field etag="2-1" value="qqff"/>
<field etag="3-0" value="ddd"/>
<field etag="3-1" value="99a"/>
</filter>
<log value="输出:${this}"/>
</step>
</transaction>
结果显示: