注文する
この記事では主に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があります。