datax底层原理_手把手实现Datax3.0中的传输通道

Datax的整体框架我们已经大体了解。这次来分析一下reader到writer中间数据的传输层。

这次采取另外一种方式,我们把代码抽取,自己实现一个通道

1-首先是定义一个接口代表传输的每一条数据public interface Record {

public void addColumn(Column column);

public void setColumn(int i, final Column column);

public Column getColumn(int i);

public String toString();

public int getColumnNumber();

public int getByteSize();

public int getMemorySize();

}

2-然后会定义一个抽象类 代表每一条数据中的每一列数据public abstract class Column {

private Type type;

private Object rawData;

private int byteSize;

public Column(final Object object, final Type type, int byteSize) {

this.rawData = object;

this.type = type;

this.byteSize = byteSize;

}

public Object getRawData() {

return this.rawData;

}

public Type getType() {

return this.type;

}

public int getByteSize() {

return this.byteSize;

}

protected void setType(Type type) {

this.type = type;

}

protected void setRawData(Object rawData) {

this.rawData = rawData;

}

protected void setByteSize(int byteSize) {

this.byteSize = byteSize;

}

public abstract Long asLong();

public abstract Double asDouble();

public abstract String asString();

public abstract Date asDate();

public abstract byte[] asBytes();

public abstract Boolean asBoolean();

public abstract BigDecimal asBigDecimal();

public abstract BigInteger asBigInteger();

@Override

public String toString() {

return JSON.toJSONString(this);

}

public enum Type {

BAD, NULL, INT, LONG, DOUBLE, STRING, BOOL, DATE, BYTES

}

}

具体实现类如:public class StringColumn extends Column {

public StringColumn() {

this((String) null);

}

public StringColumn(final String rawData) {

super(rawData, Column.Type.STRING, (null == rawData ? 0 : rawData

.length()));

}

@Override

public Long asLong() {

return null;

}

@Override

public Double asDouble() {

return null;

}

@Override

public String asString() {

if (null == this.getRawData()) {

return null;

}

return (String) this.getRawData();

}

@Override

public Date asDate() {

return null;

}

@Override

public byte[] asBytes() {

return new byte[0];

}

@Override

public Boolean asBoolean() {

return null;

}

@Override

public BigDecimal asBigDecimal() {

return null;

}

@Override

public BigInteger asBigInteger() {

return null;

}

}

注意每个实现保存数据的同时,会计算数据的大小,后面限制时候使用

3-定义一个类实现Record,主要是对reader或者writer一行数据的增加和获取public class DefaultRecord implements Record {

private static final int RECORD_AVERGAE_COLUMN_NUMBER = 16;

private List columns;

private int byteSize;

// 首先是Record本身需要的内存

private int memorySize = ClassSize.DefaultRecordHead;

public DefaultRecord() {

this.columns = new ArrayList(RECORD_AVERGAE_COLUMN_NUMBER);

}

@Override

public void addColumn(Column column) {

columns.add(column);

incrByteSize(column);

}

@Override

public Column getColumn(int i) {

if (i = columns.size()) {

return null;

}

return columns.get(i);

}

@Override

public void setColumn(int i, final Column column) {

if (i 

throw new RuntimeException("不能给index小于0的column设置值");

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值