mysql binlog c++_聊聊BinlogConnectorReplicator的work

本文主要研究一下BinlogConnectorReplicator的work

StoppableTask

maxwell-1.25.1/src/main/java/com/zendesk/maxwell/util/StoppableTask.java

public interface StoppableTask {

void requestStop() throws Exception;

void awaitStop(Long timeout) throws TimeoutException;

}

复制代码StoppableTask接口定义了requestStop、awaitStop方法

RunLoopProcess

maxwell-1.25.1/src/main/java/com/zendesk/maxwell/util/RunLoopProcess.java

abstract public class RunLoopProcess implements StoppableTask {

protected volatile StoppableTaskState taskState;

private Thread thread;

public RunLoopProcess() {

this.taskState = new StoppableTaskState(this.getClass().getName());

}

public void requestStop() {

this.taskState.requestStop();

interrupt();

}

public void interrupt() {

if ( this.thread != null )

this.thread.interrupt();

}

public void awaitStop(Long timeout) throws TimeoutException {

this.taskState.awaitStop(thread, timeout);

}

public void runLoop() throws Exception {

this.thread = Thread.currentThread();

this.beforeStart();

try {

while (this.taskState.isRunning()) {

work();

}

} finally {

this.beforeStop();

this.taskState.stopped();

}

}

protected abstract void work() throws Exception;

protected void beforeStart() throws Exception { }

protected void beforeStop() throws Exception { }

}

复制代码RunLoopProcess实现了StoppableTask接口,其runLoop方法会通过while循环不断执行work()方法,直到taskState.isRunning()为false

BinlogConnectorReplicator

maxwell-1.25.1/src/main/java/com/zendesk/maxwell/replication/BinlogConnectorReplicator.java

public class BinlogConnectorReplicator extends RunLoopProcess implements Replicator {

//......

public void work() throws Exception {

RowMap row = null;

try {

row = getRow();

} catch ( InterruptedException e ) {

}

if ( row == null )

return;

rowCounter.inc();

rowMeter.mark();

if ( scripting != null && !isMaxwellRow(row))

scripting.invoke(row);

processRow(row);

}

protected void processRow(RowMap row) throws Exception {

if ( row instanceof HeartbeatRowMap) {

producer.push(row);

if (stopAtHeartbeat != null) {

long thisHeartbeat = row.getPosition().getLastHeartbeatRead();

if (thisHeartbeat >= stopAtHeartbeat) {

LOGGER.info("received final heartbeat " + thisHeartbeat + "; stopping replicator");

// terminate runLoop

this.taskState.stopped();

}

}

} else if ( !shouldSkipRow(row) )

producer.push(row);

}

//......

}

复制代码BinlogConnectorReplicator实现了RunLoopProcess接口,其work方法通过getRow()获取RowMap,若不为null则执行processRow(row)方法;processRow方法则执行producer.push(row)

AbstractProducer

maxwell-1.25.1/src/main/java/com/zendesk/maxwell/producer/AbstractProducer.java

public abstract class AbstractProducer {

protected final MaxwellContext context;

protected final MaxwellOutputConfig outputConfig;

protected final Counter succeededMessageCount;

protected final Meter succeededMessageMeter;

protected final Counter failedMessageCount;

protected final Meter failedMessageMeter;

protected final Timer messagePublishTimer;

protected final Timer messageLatencyTimer;

protected final Counter messageLatencySloViolationCount;

public AbstractProducer(MaxwellContext context) {

this.context = context;

this.outputConfig = context.getConfig().outputConfig;

Metrics metrics = context.getMetrics();

MetricRegistry metricRegistry = metrics.getRegistry();

this.succeededMessageCount = metricRegistry.counter(metrics.metricName("messages", "succeeded"));

this.succeededMessageMeter = metricRegistry.meter(metrics.metricName("messages", "succeeded", "meter"));

this.failedMessageCount = metricRegistry.counter(metrics.metricName("messages", "failed"));

this.failedMessageMeter = metricRegistry.meter(metrics.metricName("messages", "failed", "meter"));

this.messagePublishTimer = metricRegistry.timer(metrics.metricName("message", "publish", "time"));

this.messageLatencyTimer = metricRegistry.timer(metrics.metricName("message", "publish", "age"));

this.messageLatencySloViolationCount = metricRegistry.counter(metrics.metricName("message", "publish", "age", "slo_violation"));

}

abstract public void push(RowMap r) throws Exception;

public StoppableTask getStoppableTask() {

return null;

}

public Meter getFailedMessageMeter() {

return this.failedMessageMeter;

}

public MaxwellDiagnostic getDiagnostic() {

return null;

}

}

复制代码AbstractProducer定义了push抽象方法供子类实现

StdoutProducer

maxwell-1.25.1/src/main/java/com/zendesk/maxwell/producer/StdoutProducer.java

public class StdoutProducer extends AbstractProducer {

public StdoutProducer(MaxwellContext context) {

super(context);

}

@Override

public void push(RowMap r) throws Exception {

String output = r.toJSON(outputConfig);

if ( output != null && r.shouldOutput(outputConfig) )

System.out.println(output);

this.context.setPosition(r);

}

}

复制代码StdoutProducer继承了AbstractProducer,其push方法则执行System.out.println(output)以及context.setPosition(r)

小结

StoppableTask接口定义了requestStop、awaitStop方法;RunLoopProcess实现了StoppableTask接口,其runLoop方法会通过while循环不断执行work()方法,直到taskState.isRunning()为false;BinlogConnectorReplicator实现了RunLoopProcess接口,其work方法通过getRow()获取RowMap,若不为null则执行processRow(row)方法;processRow方法则执行producer.push(row)

doc

BinlogConnectorReplicator

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[聊聊BinlogConnectorReplicator的work]http://www.zyiz.net/tech/detail-132257.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值