CanalEventDownStreamHandlerについて話す

注文する

この記事では主にCanalEventDownStreamHandlerについて説明します

CanalEventDownStreamHandler

canal-1.1.4 / sink / src / main / java / com / alibaba / otter / canal / sink / CanalEventDownStreamHandler.java

public interface CanalEventDownStreamHandler<T> extends CanalLifeCycle {

    /**
     * 提交到store之前做一下处理,允许替换Event
     */
    public T before(T events);

    /**
     * store处于full后,retry时处理做一下处理
     */
    public T retry(T events);

    /**
     * 提交store成功后做一下处理
     */
    public T after(T events);
}
复制代码
  • CanalEventDownStreamHandlerは、メソッドの前、再試行、後を定義するCanalLifeCycleインターフェースを継承します

AbstractCanalEventDownStreamHandler

canal-1.1.4 / sink / src / main / java / com / alibaba / otter / canal / sink / AbstractCanalEventDownStreamHandler.java

public class AbstractCanalEventDownStreamHandler<T> extends AbstractCanalLifeCycle implements CanalEventDownStreamHandler<T> {

    public T before(T events) {
        return events;
    }

    public T retry(T events) {
        return events;
    }

    public T after(T events) {
        return events;
    }

}
复制代码
  • AbstractCanalEventDownStreamHandlerはAbstractCanalLifeCycleを継承し、CanalEventDownStreamHandlerインターフェイスを実装します。before、retry、およびafterメソッドは、デフォルトで入力されたイベントを返します。

HeartBeatEntryEventHandler

canal-1.1.4 / sink / src / main / java / com / alibaba / otter / canal / sink / entry / HeartBeatEntryEventHandler.java

public class HeartBeatEntryEventHandler extends AbstractCanalEventDownStreamHandler<List<Event>> {

    public List<Event> before(List<Event> events) {
        boolean existHeartBeat = false;
        for (Event event : events) {
            if (event.getEntryType() == EntryType.HEARTBEAT) {
                existHeartBeat = true;
            }
        }

        if (!existHeartBeat) {
            return events;
        } else {
            // 目前heartbeat和其他事件是分离的,保险一点还是做一下检查处理
            List<Event> result = new ArrayList<Event>();
            for (Event event : events) {
                if (event.getEntryType() != EntryType.HEARTBEAT) {
                    result.add(event);
                }
            }

            return result;
        }
    }

}
复制代码
  • HeartBeatEntryEventHandlerはAbstractCanalEventDownStreamHandlerを継承し、そのbeforeメソッドはイベントをトラバースしてEntryType.HEARTBEATタイプのイベントがあるかどうかを判断し、ない場合はすぐにイベントを返し、ある場合は非ハートビートイベントを返します

PrometheusCanalEventDownStreamHandler

canal-1.1.4 / prometheus / src / main / java / com / alibaba / otter / canal / prometheus / impl / PrometheusCanalEventDownStreamHandler.java

public class PrometheusCanalEventDownStreamHandler extends AbstractCanalEventDownStreamHandler<List<Event>> {

    private final AtomicLong latestExecuteTime  = new AtomicLong(System.currentTimeMillis());
    private final AtomicLong transactionCounter = new AtomicLong(0L);

    @Override
    public List<Event> before(List<Event> events) {
        long localExecTime = 0L;
        if (events != null && !events.isEmpty()) {
            for (Event e : events) {
                EntryType type = e.getEntryType();
                if (type == null) continue;
                switch (type) {
                    case TRANSACTIONBEGIN: {
                        long exec = e.getExecuteTime();
                        if (exec > 0) localExecTime = exec;
                        break;
                    }
                    case ROWDATA: {
                        long exec = e.getExecuteTime();
                        if (exec > 0) localExecTime = exec;
                        break;
                    }
                    case TRANSACTIONEND: {
                        long exec = e.getExecuteTime();
                        if (exec > 0) localExecTime = exec;
                        transactionCounter.incrementAndGet();
                        break;
                    }
                    case HEARTBEAT:
                        CanalEntry.EventType eventType = e.getEventType();
                        if (eventType == CanalEntry.EventType.MHEARTBEAT) {
                            localExecTime = System.currentTimeMillis();
                        }
                        break;
                    default:
                        break;
                }
            }
            if (localExecTime > 0) {
                latestExecuteTime.lazySet(localExecTime);
            }
        }
        return events;
    }

    @Override
    public void start() {

        super.start();
    }

    @Override
    public void stop() {
        super.stop();
    }

    public AtomicLong getLatestExecuteTime() {
        return latestExecuteTime;
    }

    public AtomicLong getTransactionCounter() {
        return transactionCounter;
    }

}
复制代码
  • PrometheusCanalEventDownStreamHandlerはAbstractCanalEventDownStreamHandlerを継承し、そのbeforeメソッドはイベントをトラバースしてから、さまざまなEntryTypesに従ってlocalExecTime、transactionCounter、latestExecuteTimeを更新します

まとめ

CanalEventDownStreamHandlerは、CanalLifeCycleインターフェイスを継承します。これは、before、retry、およびafterメソッドを定義します。AbstractCanalEventDownStreamHandlerは、AbstractCanalLifeCycleを継承し、CanalEventDownStreamHandlerインターフェイスを実装します。before、retry、およびafterメソッドは、デフォルトで入力されたイベントを返します。HeartBeatEntryEventHandlerとPrometheusCanalEventDownStreamHandlerが継承したAbstractCanalEventDownStreamがあります。

文書

おすすめ

転載: juejin.im/post/5e9727ade51d4560ea3206d6