13.2. 扩展方式

13.2.1. 接口

针对“数据库表输入”的指定字段类型扩展,需实现接口:

com.apusic.esb.das.extension.ColumnOverrideExtension 

该接口如下:

import java.lang.reflect.Method;

public interface ColumnOverrideExtension {

    /** ResultSet类名 */
    static final String CLASS_RESULT_SET = "java.sql.ResultSet";

    /**
     * 获取用户指定的类型,可根据不同<code>columnName</code>返回不同的类型,如果指定了类型,须在返回前将传入的<code>context</code>的<code>overridden</code>属性设置为
     * <code>true</code>。
     * 
     * @param context 上下文信息,目前主要为是否被用户重写<code>overridden</code>属性
     * @param colunmName 列属性名
     * @param oldType 原数据库中的类型
     * @throws 如果传入的<code>context</code>为<code>null</code>,则抛出<code>NullPointerException</code>异常
     * @return 用户指定的类型。
     */
    int getDesignatedType(COContext context, final String columnName, final int oldType);

    /**
     * 获取用户指定Result Set的读取方法,可根据不同<code>columnName</code>返回不同的读取方法,如果指定了读取方法,须在返回前将传入的<code>context</code>的
     * <code>overridden</code>属性设置为<code>true</code>。
     * 
     * @param context 上下文信息,目前主要为是否被用户重写<code>overridden</code>属性
     * @param colunmName 列属性名
     * @param oldType 原数据库中的类型
     * @param newType 用户指定的新类型
     * @throws 如果传入的<code>context</code>为<code>null</code>,则抛出<code>NullPointerException</code>异常
     * @return 用户指定Result Set的读取方法,如果用户未指定,则返回null,系统将采用原来的读取方法。
     */
    Method getDesignatedResultSetMothod(COContext context, final String columnName, final int oldType, final int newType);

    /**
     * 获取用户指定类型的数据,可根据不同<code>columnName</code>返回不同的指定类型数据,如果指定了类型数据,须在返回前将传入的<code>context</code>的
     * <code>overridden</code>属性设置为<code>true</code>。
     * 
     * @param context 上下文信息,目前主要为是否被用户重写<code>overridden</code>属性
     * @param srcData 原数据库中的数据
     * @param colunmName 列属性名
     * @param oldType 原数据库中的类型
     * @param newType 用户指定的新类型
     * @throws 如果传入的<code>context</code>为<code>null</code>,则抛出<code>NullPointerException</code>异常
     * @return 用户指定类型的数据,如果用户未指定,则返回原数据库中的数据。
     */
    Object getDesignatedData(COContext context,
                             final Object srcData,
                             final String columnName,
                             final int oldType,
                             final int newType);

}

其中COContext中包含如下信息:

    /** 是否被用户重写*/    
    private boolean overridden;
    public boolean isOverridden() {
        return overridden;
    }
    public void setOverridden(boolean overridden) {
        this.overridden = overridden;
    }

13.2.2. 实现用户指定类型扩展

接下来,我们来实现这个扩展。

1.将数据库中的“SEX”字段取出,由“VARCHAR”类型改为“VARBINARY”类型,通过getDesignatedData()方法将数据库取出的数据转换为二进制类型的数据。修改字段类型后,应将COContext的overridden设置为true。

2.将数据库中的“CREATETIME”字段取出,由“DATE”类型改为“TIMESTAMP”类型,通过getDesignatedResultSetMothod()方法指定从数据库中通过“getTimestamp(int columnIndex)”方法读取数据。修改字段类型后,应将COContext的overridden设置为true。

package com.apusic.esb.das.extension.COColumnOverrideExtensionImpl

import java.lang.reflect.Method;
import java.sql.Types;

public class COColumnOverrideExtensionImpl implements ColumnOverrideExtension {

    public int getDesignatedType(COContext context, final String columnName, final int oldType) {
        if (context == null) {
            throw new NullPointerException();
        }
        if ("SEX".equals(columnName)) {
            context.setOverridden(true);
            return Types.VARBINARY;
        }
        if ("CREATETIME".equals(columnName)){
            context.setOverridden(true);
            return Types.TIMESTAMP;
        }
        return Integer.MIN_VALUE;
    }

    public Method getDesignatedResultSetMothod(COContext context, String columnName, int oldType, int newType) {
        if (context == null) {
            throw new NullPointerException();
        }
        Class<?> clazz = null;
        try {
            clazz = Class.forName(ColumnOverrideExtension.CLASS_RESULT_SET);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if ("CREATETIME".equals(columnName)){
            context.setOverridden(true);
            try {
                return clazz.getMethod("getTimestamp", int.class);
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public Object getDesignatedData(COContext context,
                                    final Object srcData,
                                    final String columnName,
                                    final int oldType,
                                    final int newType) {
        
        if (context == null) {
            throw new NullPointerException();
        }
        Object designatedData = srcData;
        if ("SEX".equals(columnName)) {
            designatedData = ((String) srcData).getBytes();
            context.setOverridden(true);
        }
        return designatedData;
    }
}

13.2.3. 集成用户指定字段类型

集成用户指定字段类型分三步:

  • 1.配置用户自定义的策略:将接口的扩展实现类打成jar包,并在此jar包中的META-INF/services下新建文件名为com.apusic.esb.das.extension.ColumnOverrideExtension,如下图所示:

    新建文件

    图 13.1. 新建文件


  • 2.打开文件com.apusic.esb.das.extension.ColumnOverrideExtension, 插入如下图所示的内容:

    插入内容

    图 13.2. 插入内容


    内容为用户实现类的完整类型,并指定表名tableName(这里的表名指的是在“表输入”组件中自定义的表名,严格区分大小写)。

  • 3.将该jar包部署在需要进行扩展的AESB节点的lib目录下。

    部署位置

    图 13.3. 部署位置