Flume-ng null事件的自定义接收器

时间:2013-03-10 03:40:35

标签: flume

我正在尝试为flume-ng编写一个自定义接收器。我查看了现有的接收器和文档并对其进行了编码。但是,应该接收事件的'process()'方法总是以null结尾。 我正在做Event event = channel.take();但事件为空。我在日志中看到,当事件仍在通道中时,会重复调用此方法。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

这是流程函数的骨架...如果您未能获得回滚的事件,请将状态更改为 BACKOFF 。如果不是,您提交并将状态设置为 READY 。无论如何,你总是关闭交易。

    Status status = null;
    Channel channel = getChannel();
    Transaction transaction = channel.getTransaction();
    transaction.begin();
    try {
        Event event = channel.take();

        if (event != null && validEvent(event.getBody()) >= 0) {
           # make some printing
        }
        transaction.commit();
        status = Status.READY;
    } catch (Throwable ex) {
        transaction.rollback();
        status = Status.BACKOFF;
        logger.error("Failed to deliver event. Exception follows.", ex);
        throw new EventDeliveryException("Failed to deliver event: " + ex);
    } finally {
        transaction.close();
    }
    return status;

我相信这会奏效:)。

答案 1 :(得分:4)

这是设计的。接收器运行器将使用null事件轮询接收器,因此可以确定接收器处于活动状态并准备接受未来事件。当您收到null事件时,请确保返回Status.BACKOFF,并且接收处理器将等待一段时间再重试。