mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
模块化mq connector (#2562)
* add connector module, add kafka producer connector module for server * add rocketMQ producer connector module for server * add rabbitMQ producer connector module for server * optimize code, add annotation * add canal message consumer connector for canal-adapter module
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
package com.alibaba.otter.canal.connector.tcp.config;
|
||||
|
||||
public class TCPConstants {
|
||||
|
||||
public static final String ROOT = "canal";
|
||||
|
||||
public static final String CANAL_TCP_HOST = ROOT + "." + "tcp.server.host";
|
||||
public static final String CANAL_TCP_ZK_HOSTS = ROOT + "." + "tcp.zookeeper.hosts";
|
||||
public static final String CANAL_TCP_USERNAME = ROOT + "." + "tcp.username";
|
||||
public static final String CANAL_TCP_PASSWORD = ROOT + "." + "tcp.password";
|
||||
public static final String CANAL_TCP_BATCH_SIZE = ROOT + "." + "tcp.batch.size";
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
package com.alibaba.otter.canal.connector.tcp.consumer;
|
||||
|
||||
import com.alibaba.otter.canal.client.CanalConnector;
|
||||
import com.alibaba.otter.canal.client.impl.ClusterCanalConnector;
|
||||
import com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy;
|
||||
import com.alibaba.otter.canal.client.impl.SimpleCanalConnector;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.connector.core.consumer.CommonMessage;
|
||||
import com.alibaba.otter.canal.connector.core.spi.CanalMsgConsumer;
|
||||
import com.alibaba.otter.canal.connector.core.spi.SPI;
|
||||
import com.alibaba.otter.canal.connector.core.util.MessageUtil;
|
||||
import com.alibaba.otter.canal.connector.tcp.config.TCPConstants;
|
||||
import com.alibaba.otter.canal.protocol.Message;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* TCP 消费者连接器, 一个destination对应一个SPI实例
|
||||
*
|
||||
* @author rewerma 2020-01-30
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@SPI("tcp")
|
||||
public class CanalTCPConsumer implements CanalMsgConsumer {
|
||||
|
||||
private static final String PREFIX_TCP_CONFIG = "canal.tcp.";
|
||||
|
||||
private Long currentBatchId = null;
|
||||
|
||||
private CanalConnector canalConnector;
|
||||
|
||||
private int batchSize = 500;
|
||||
|
||||
@Override
|
||||
public void init(Properties properties, String destination, String groupId) {
|
||||
// load config
|
||||
String host = properties.getProperty(TCPConstants.CANAL_TCP_HOST);
|
||||
String username = properties.getProperty(TCPConstants.CANAL_TCP_USERNAME);
|
||||
String password = properties.getProperty(TCPConstants.CANAL_TCP_PASSWORD);
|
||||
String zkHosts = properties.getProperty(TCPConstants.CANAL_TCP_ZK_HOSTS);
|
||||
String batchSizePro = properties.getProperty(TCPConstants.CANAL_TCP_BATCH_SIZE);
|
||||
if (batchSizePro != null) {
|
||||
batchSize = Integer.parseInt(batchSizePro);
|
||||
}
|
||||
if (host != null) {
|
||||
String[] ipPort = host.split(":");
|
||||
SocketAddress sa = new InetSocketAddress(ipPort[0], Integer.parseInt(ipPort[1]));
|
||||
this.canalConnector = new SimpleCanalConnector(sa, username, password, destination);
|
||||
} else {
|
||||
this.canalConnector = new ClusterCanalConnector(username,
|
||||
password,
|
||||
destination,
|
||||
new ClusterNodeAccessStrategy(destination, ZkClientx.getZkClient(zkHosts)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connect() {
|
||||
canalConnector.connect();
|
||||
canalConnector.subscribe();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CommonMessage> getMessage(Long timeout, TimeUnit unit) {
|
||||
try {
|
||||
Message message = canalConnector.getWithoutAck(batchSize, timeout, unit);
|
||||
long batchId = message.getId();
|
||||
currentBatchId = batchId;
|
||||
int size = message.getEntries().size();
|
||||
if (batchId == -1 || size == 0) {
|
||||
return null;
|
||||
} else {
|
||||
return MessageUtil.convert(message);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rollback() {
|
||||
if (currentBatchId != null && currentBatchId != -1) {
|
||||
canalConnector.rollback(currentBatchId);
|
||||
currentBatchId = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ack() {
|
||||
if (currentBatchId != null) {
|
||||
canalConnector.ack(currentBatchId);
|
||||
currentBatchId = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect() {
|
||||
canalConnector.unsubscribe();
|
||||
canalConnector.disconnect();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
tcp=com.alibaba.otter.canal.connector.tcp.consumer.CanalTCPConsumer
|
||||
Reference in New Issue
Block a user