如何为每个批次重置Flume的自定义接收器类中的变量

时间:2017-03-16 04:00:27

标签: java flume

我有一个水槽过程,从spooldir&上的文件中读取数据。将数据加载到MySQL数据库中。将有多种类型的文件可以由同一个水槽过程处理。

我创建了一个自定义接收器java类(扩展AbstractSink),它在初始/第一次读取后更新局部变量(sInterfaceType)以决定文件中的数据格式。 我必须在文件处理完成后重置它,因此它必须从识别下一个批处理/接口文件开始。

我试图在stop()中做但是没有帮助。有没有人这样做?

我的接收器类看起来像这样:

public class MyFlumeSink2 extends AbstractSink implements Configurable {

 private String sInterfaceType; //tells file format of current load

 public MyFlumeSink2() {
  //my initialization of variables
 }

 public void configure(Context context) {
  //read context variables
 }

 public void start() {
  //create db connection
 }

 @Override
 public void stop() {
  //destroy connection
  sInterfaceType = ""; //This doesn't help me
  super.stop();
 }

 public Status process() throws EventDeliveryException {
   Channel channel = getChannel();
   Transaction transaction = channel.getTransaction();

   if((sInterfaceType=="" || sInterfaceType==null))
   {
    //Read first line & set sInterfaceType
   }else
     //Insert data in MySQL

   transaction.commit();
 }
}

1 个答案:

答案 0 :(得分:0)

我们必须手动决定它是哪个事件,没有为每个新文件调用专门的方法。

我修改了我的代码以阅读事件行&根据第一个元素设置InterfaceType。我的代码如下所示:

public Status process() throws EventDeliveryException {
        //....other code...

            sEvtBody = new String(event.getBody());
            sFields = sEvtBody.split(",");

            //check first field to know record type
            enumRec = RecordType.valueOf( checkRecordType(sFields[0].toUpperCase()) );
            switch(enumRec)
            {
                case CUST_ID:
                    sInterfaceType = "T_CUST";
                    bHeader = true;
                    break;
                case TXN_ID:
                    sInterfaceType = "T_CUST_TXNS";
                    bHeader = true;
                    break;
                default:
                    bHeader = false;
            }
            //insert if not header
            if(!bHeader)
            {

                if(sInterfaceType == "T_CUST")
                {
                    if(sFields.length == 14)
                        this.bInsertStatus = daoClass.insertHeader(sFields);
                    else
                        throw new Exception("INCORRECT_COLUMN_COUNT");
                }else if(sInterfaceType == "T_CUST_TXNS")
                {
                    if(sFields.length == 10)
                        this.bInsertStatus = daoClass.insertData(sFields);
                    else
                        throw new Exception("INCORRECT_COLUMN_COUNT");
                }

                //if(!bInsertStatus)
                //  logTransaction(sFields);
            }
            //....Other code....