public class KafkaCanalConnector extends java.lang.Object implements CanalMQConnector
注意点: 1. 相比于canal SimpleCanalConnector, 这里get和ack操作不能有并发, 必须是一个线程执行get后,内存里执行完毕ack后再取下一个get
| 限定符和类型 | 字段和说明 |
|---|---|
protected boolean |
connected |
protected boolean |
flatMessage |
protected org.apache.kafka.clients.consumer.KafkaConsumer<java.lang.String,Message> |
kafkaConsumer |
protected org.apache.kafka.clients.consumer.KafkaConsumer<java.lang.String,java.lang.String> |
kafkaConsumer2 |
protected java.lang.Integer |
partition |
protected java.util.Properties |
properties |
protected boolean |
running |
protected java.lang.String |
topic |
| 构造器和说明 |
|---|
KafkaCanalConnector(java.lang.String servers,
java.lang.String topic,
java.lang.Integer partition,
java.lang.String groupId,
java.lang.Integer batchSize,
boolean flatMessage) |
| 限定符和类型 | 方法和说明 |
|---|---|
void |
ack()
提交offset,如果超过 session.timeout.ms 设置的时间没有ack则会抛出异常,ack失败
|
void |
ack(long batchId)
进行 batch id 的确认。
|
boolean |
checkValid()
检查下链接是否合法
几种case下链接不合法:
1.
|
void |
connect()
打开连接
|
void |
disconnect()
关闭链接
|
Message |
get(int batchSize)
获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待
|
Message |
get(int batchSize,
java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
获取数据,自动进行确认
该方法返回的条件:
a.
|
java.util.List<FlatMessage> |
getFlatList(java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
获取数据,自动进行确认,设置timeout时间直到拿到数据为止
该方法返回的条件:
a.
|
java.util.List<FlatMessage> |
getFlatListWithoutAck(java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
获取数据,设置timeout时间直到拿到数据为止
该方法返回的条件:
a.
|
java.util.List<Message> |
getList(java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
获取数据,自动进行确认,设置timeout时间直到拿到数据为止
该方法返回的条件:
a.
|
java.util.List<Message> |
getListWithoutAck(java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
获取数据,设置timeout时间直到拿到数据为止
该方法返回的条件:
a.
|
Message |
getWithoutAck(int batchSize)
不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待
canal 会记住此 client 最新的position。 |
Message |
getWithoutAck(int batchSize,
java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
不指定 position 获取事件.
|
void |
rollback()
回滚到未进行
CanalMQConnector.ack() 的地方,下次fetch的时候,可以从最后一个没有 CanalMQConnector.ack() 的地方开始拿 |
void |
rollback(long batchId)
回滚到未进行
CanalConnector.ack(long) 的地方,指定回滚具体的batchId |
void |
setSessionTimeout(java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
重新设置sessionTime
|
void |
subscribe()
订阅topic
|
void |
subscribe(java.lang.String filter)
客户端订阅,重复订阅时会更新对应的filter信息
说明:
a.
|
void |
unsubscribe()
取消订阅
|
protected void |
waitClientRunning() |
protected org.apache.kafka.clients.consumer.KafkaConsumer<java.lang.String,Message> kafkaConsumer
protected org.apache.kafka.clients.consumer.KafkaConsumer<java.lang.String,java.lang.String> kafkaConsumer2
protected java.lang.String topic
protected java.lang.Integer partition
protected java.util.Properties properties
protected volatile boolean connected
protected volatile boolean running
protected boolean flatMessage
public KafkaCanalConnector(java.lang.String servers,
java.lang.String topic,
java.lang.Integer partition,
java.lang.String groupId,
java.lang.Integer batchSize,
boolean flatMessage)
public void connect()
connect 在接口中 CanalConnectorpublic void disconnect()
disconnect 在接口中 CanalConnectorprotected void waitClientRunning()
public boolean checkValid()
CanalConnector几种case下链接不合法: 1. 链接canal server失败,一直没有一个可用的链接,返回false 2. 当前客户端在进行running抢占的时候,做为备份节点存在,非处于工作节点,返回false 说明: a. 当前客户端一旦做为备份节点存在,当前所有的对CanalConnector的操作都会处于阻塞状态,直到转为工作节点 b. 所以业务方最好定时调用checkValid()方法用,比如调用CanalConnector所在线程的interrupt,直接退出CanalConnector,并根据自己的需要退出自己的资源
checkValid 在接口中 CanalConnectorpublic void subscribe()
subscribe 在接口中 CanalConnectorpublic void unsubscribe()
unsubscribe 在接口中 CanalConnectorpublic java.util.List<Message> getList(java.lang.Long timeout, java.util.concurrent.TimeUnit unit) throws CanalClientException
CanalMQConnector该方法返回的条件: a. 如果timeout=0,有多少取多少,不会阻塞等待 b. 如果timeout不为0,尝试阻塞对应的超时时间,直到拿到数据就返回
getList 在接口中 CanalMQConnectorCanalClientExceptionpublic java.util.List<Message> getListWithoutAck(java.lang.Long timeout, java.util.concurrent.TimeUnit unit) throws CanalClientException
CanalMQConnector该方法返回的条件: a. 如果timeout=0,有多少取多少,不会阻塞等待 b. 如果timeout不为0,尝试阻塞对应的超时时间,直到拿到数据就返回
getListWithoutAck 在接口中 CanalMQConnectorCanalClientExceptionpublic java.util.List<FlatMessage> getFlatList(java.lang.Long timeout, java.util.concurrent.TimeUnit unit) throws CanalClientException
CanalMQConnector该方法返回的条件: a. 如果timeout=0,有多少取多少,不会阻塞等待 b. 如果timeout不为0,尝试阻塞对应的超时时间,直到拿到数据就返回
getFlatList 在接口中 CanalMQConnectorCanalClientExceptionpublic java.util.List<FlatMessage> getFlatListWithoutAck(java.lang.Long timeout, java.util.concurrent.TimeUnit unit) throws CanalClientException
CanalMQConnector该方法返回的条件: a. 如果timeout=0,有多少取多少,不会阻塞等待 b. 如果timeout不为0,尝试阻塞对应的超时时间,直到拿到数据就返回
getFlatListWithoutAck 在接口中 CanalMQConnectorCanalClientExceptionpublic void rollback()
CanalMQConnectorCanalMQConnector.ack() 的地方,下次fetch的时候,可以从最后一个没有 CanalMQConnector.ack() 的地方开始拿rollback 在接口中 CanalConnectorrollback 在接口中 CanalMQConnectorpublic void ack()
ack 在接口中 CanalMQConnectorpublic void subscribe(java.lang.String filter)
throws CanalClientException
CanalConnector说明: a. 如果本次订阅中filter信息为空,则直接使用canal server服务端配置的filter信息 b. 如果本次订阅中filter信息不为空,目前会直接替换canal server服务端配置的filter信息,以本次提交的为准 TODO: 后续可以考虑,如果本次提交的filter不为空,在执行过滤时,是对canal server filter + 本次filter的交集处理,达到只取1份binlog数据,多个客户端消费不同的表
subscribe 在接口中 CanalConnectorCanalClientExceptionpublic Message get(int batchSize) throws CanalClientException
CanalConnectorget 在接口中 CanalConnectorCanalClientExceptionpublic Message get(int batchSize, java.lang.Long timeout, java.util.concurrent.TimeUnit unit) throws CanalClientException
CanalConnector该方法返回的条件: a. 拿够batchSize条记录或者超过timeout时间 b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
get 在接口中 CanalConnectorCanalClientExceptionpublic Message getWithoutAck(int batchSize) throws CanalClientException
CanalConnectorgetWithoutAck 在接口中 CanalConnectorCanalClientExceptionpublic Message getWithoutAck(int batchSize, java.lang.Long timeout, java.util.concurrent.TimeUnit unit) throws CanalClientException
CanalConnector该方法返回的条件: a. 拿够batchSize条记录或者超过timeout时间 b. 如果timeout=0,则阻塞至拿到batchSize记录才返回canal 会记住此 client 最新的position。
getWithoutAck 在接口中 CanalConnectorCanalClientExceptionpublic void ack(long batchId)
throws CanalClientException
CanalConnectorack 在接口中 CanalConnectorCanalClientExceptionpublic void rollback(long batchId)
throws CanalClientException
CanalConnectorCanalConnector.ack(long) 的地方,指定回滚具体的batchIdrollback 在接口中 CanalConnectorCanalClientExceptionpublic void setSessionTimeout(java.lang.Long timeout,
java.util.concurrent.TimeUnit unit)
timeout - unit - Copyright © 2021. All rights reserved.