自定义插件

插件注册

引入插件过程

  • 将插件打成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;
        }
    }
}

1666853236455

插件注册

<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>

结果显示:

1666853033207

results matching ""

    No results matching ""