package com.alibaba.datax.plugin.reader.hbase094xreader;
import com.alibaba.datax.common.element.Record;
import com.alibaba.datax.common.exception.DataXException;
import com.alibaba.datax.common.plugin.RecordSender;
import com.alibaba.datax.common.spi.Reader;
import com.alibaba.datax.common.util.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* Hbase094xReader
* Created by shf on 16/3/7.
*/
public class Hbase094xReader extends Reader {
public static class Job extends Reader.Job {
private Configuration originConfig = null;
@Override
public void init() {
this.originConfig = this.getPluginJobConf();
Hbase094xHelper.validateParameter(this.originConfig);
}
@Override
public List<Configuration> split(int adviceNumber) {
return Hbase094xHelper.split(this.originConfig);
}
@Override
public void destroy() {
}
}
public static class Task extends Reader.Task {
private Configuration taskConfig;
private static Logger LOG = LoggerFactory.getLogger(Task.class);
private HbaseAbstractTask hbaseTaskProxy;
@Override
public void init() {
this.taskConfig = super.getPluginJobConf();
String mode = this.taskConfig.getString(Key.MODE);
ModeType modeType = ModeType.getByTypeName(mode);
switch (modeType) {
case Normal:
this.hbaseTaskProxy = new NormalTask(this.taskConfig);
break;
case MultiVersionFixedColumn:
this.hbaseTaskProxy = new MultiVersionFixedColumnTask(this.taskConfig);
break;
default:
throw DataXException.asDataXException(Hbase094xReaderErrorCode.ILLEGAL_VALUE, "Hbasereader 不支持此类模式:" + modeType);
}
}
@Override
public void prepare() {
try {
this.hbaseTaskProxy.prepare();
} catch (Exception e) {
throw DataXException.asDataXException(Hbase094xReaderErrorCode.PREPAR_READ_ERROR, e);
}
}
@Override
public void startRead(RecordSender recordSender) {
Record record = recordSender.createRecord();
boolean fetchOK;
while (true) {
try {
fetchOK = this.hbaseTaskProxy.fetchLine(record);
} catch (Exception e) {
LOG.info("Exception", e);
super.getTaskPluginCollector().collectDirtyRecord(record, e);
record = recordSender.createRecord();
continue;
}
if (fetchOK) {
recordSender.sendToWriter(record);
record = recordSender.createRecord();
} else {
break;
}
}
recordSender.flush();
}
@Override
public void post() {
super.post();
}
@Override
public void destroy() {
if (this.hbaseTaskProxy != null) {
this.hbaseTaskProxy.close();
}
}
}
}