Java FLUME IllegalStateException:在事务打开时调用begin()

Java FLUME IllegalStateException:在事务打开时调用begin(),java,flume,illegalstateexception,flume-ng,flume-twitter,Java,Flume,Illegalstateexception,Flume Ng,Flume Twitter,我已经编写了名为MySink的定制水槽水槽水槽,其处理方法在下面的第一个片段中指出。我得到一个IllegalStateException,如下所示(详细的堆栈跟踪在下面的第二段代码中提供): 原因:java.lang.IllegalStateException:begin()在 交易已打开 问题:在编写过程方法时,我遵循了flume代码库中的KafkaSink和类似的现有接收器实现,并对这些现有接收器应用了非常相同的事务处理逻辑。你能告诉我这里的处理方法有什么问题吗?我怎样才能解决这个问题 处理

我已经编写了名为MySink的定制水槽水槽水槽,其处理方法在下面的第一个片段中指出。我得到一个IllegalStateException,如下所示(详细的堆栈跟踪在下面的第二段代码中提供):

原因:java.lang.IllegalStateException:begin()在 交易已打开

问题:在编写过程方法时,我遵循了flume代码库中的KafkaSink和类似的现有接收器实现,并对这些现有接收器应用了非常相同的事务处理逻辑。你能告诉我这里的处理方法有什么问题吗?我怎样才能解决这个问题

处理方法(我已经标记了引发异常的位置):

@Override
public Status process() throws EventDeliveryException {
    Status status = Status.READY;
    Channel ch = getChannel();
    Transaction txn = ch.getTransaction();
    Event event = null;

    try {
        LOG.info(getName() + " BEFORE txn.begin()");
    //!!!! EXCEPTION IS THROWN in the following LINE !!!!!!
        txn.begin();
        LOG.info(getName() + " AFTER txn.begin()");
        LOG.info(getName() + " BEFORE ch.take()");
        event = ch.take();
        LOG.info(getName() + " AFTER ch.take()");

        if (event == null) {
            // No event found, request back-off semantics from the sink runner
            LOG.info(getName() + " - EVENT is null! ");
            return Status.BACKOFF;
        }

        Map<String, String> keyValueMapInTheMessage = event.getHeaders();
        if (!keyValueMapInTheMessage.isEmpty()) {
            mDBWriter.insertDataToDB(keyValueMapInTheMessage);
        }

        LOG.info(getName() + " - EVENT: " + EventHelper.dumpEvent(event));
        if (txn != null) {
            txn.commit();                
        }

    } catch (Exception ex) {
        String errMsg = getName() + " - Failed to publish events. Exception: ";
        LOG.info(errMsg);
        status = Status.BACKOFF;
        if (txn != null) {
            try {
                txn.rollback();
            } catch (Exception e) {
                LOG.info(getName() + " - EVENT: " + EventHelper.dumpEvent(event));
                throw Throwables.propagate(e);
            }
        }
        throw new EventDeliveryException(errMsg, ex);
    } finally {
        if (txn != null) {
            txn.close();
        }
    }

    return status;
}
2016-01-22 14:01:15,440 (SinkRunner-PollingRunner-DefaultSinkProcessor) [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:160)]  

Unable to deliver event. Exception follows.
if(事件==null){
//未找到事件,请从接收器运行程序请求回退语义
LOG.info(getName()+“-事件为空!”);
返回状态。后退;

}
我发现了问题的根源。我正在使用MapR的OJAI API存储接收器正在接收的数据,如果我删除存储数据的行,异常似乎会消失,即:mDBWriter.insertDataToDB(keyValueMapInTheMessage);我正在调查这个OJAI API中导致事务混乱的原因是什么。我有一个自定义接收器的类似问题。你解决过这个问题吗?
org.apache.flume.EventDeliveryException: MySink - Failed to publish events.
Exception:    at com.XYZ.flume.maprdb.MySink.process(MySink.java:116)
at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68)
at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: begin() called when transaction is OPEN!
at com.google.common.base.Preconditions.checkState(Preconditions.java:145)
at org.apache.flume.channel.BasicTransactionSemantics.begin(BasicTransactionSemantics.java:131)
at com.XYZ.flume.maprdb.MySink.process(MySink.java:82)
... 3 more