mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
init
This commit is contained in:
35
instance/core/pom.xml
Normal file
35
instance/core/pom.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal</artifactId>
|
||||
<version>1.0.19-SNAPSHOT</version>
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.instance.core</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>canal instance core module for otter ${project.version}</name>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.common</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.store</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.meta</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.parse</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.alibaba.otter.canal.instance.core;
|
||||
|
||||
import com.alibaba.otter.canal.common.CanalLifeCycle;
|
||||
import com.alibaba.otter.canal.common.alarm.CanalAlarmHandler;
|
||||
import com.alibaba.otter.canal.meta.CanalMetaManager;
|
||||
import com.alibaba.otter.canal.parse.CanalEventParser;
|
||||
import com.alibaba.otter.canal.protocol.ClientIdentity;
|
||||
import com.alibaba.otter.canal.sink.CanalEventSink;
|
||||
import com.alibaba.otter.canal.store.CanalEventStore;
|
||||
|
||||
/**
|
||||
* 代表单个canal实例,比如一个destination会独立一个实例
|
||||
*
|
||||
* @author jianghang 2012-7-12 下午12:04:58
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface CanalInstance extends CanalLifeCycle {
|
||||
|
||||
public String getDestination();
|
||||
|
||||
public CanalEventParser getEventParser();
|
||||
|
||||
public CanalEventSink getEventSink();
|
||||
|
||||
public CanalEventStore getEventStore();
|
||||
|
||||
public CanalMetaManager getMetaManager();
|
||||
|
||||
public CanalAlarmHandler getAlarmHandler();
|
||||
|
||||
/**
|
||||
* 客户端发生订阅/取消订阅行为
|
||||
*/
|
||||
public boolean subscribeChange(ClientIdentity identity);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.alibaba.otter.canal.instance.core;
|
||||
|
||||
/**
|
||||
* @author zebin.xuzb @ 2012-7-12
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface CanalInstanceGenerator {
|
||||
|
||||
/**
|
||||
* 通过 destination 产生特定的 {@link CanalInstance}
|
||||
*
|
||||
* @param destination
|
||||
* @return
|
||||
*/
|
||||
CanalInstance generate(String destination);
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.alibaba.otter.canal.instance.core;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.otter.canal.common.AbstractCanalLifeCycle;
|
||||
import com.alibaba.otter.canal.parse.CanalEventParser;
|
||||
import com.alibaba.otter.canal.parse.ha.CanalHAController;
|
||||
import com.alibaba.otter.canal.parse.ha.HeartBeatHAController;
|
||||
import com.alibaba.otter.canal.parse.inbound.AbstractEventParser;
|
||||
import com.alibaba.otter.canal.parse.inbound.group.GroupEventParser;
|
||||
import com.alibaba.otter.canal.parse.inbound.mysql.MysqlEventParser;
|
||||
import com.alibaba.otter.canal.parse.index.CanalLogPositionManager;
|
||||
|
||||
/**
|
||||
* @author zebin.xuzb 2012-10-17 下午3:12:34
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public abstract class CanalInstanceSupport extends AbstractCanalLifeCycle {
|
||||
|
||||
protected void beforeStartEventParser(CanalEventParser eventParser) {
|
||||
|
||||
boolean isGroup = (eventParser instanceof GroupEventParser);
|
||||
if (isGroup) {
|
||||
// 处理group的模式
|
||||
List<CanalEventParser> eventParsers = ((GroupEventParser) eventParser).getEventParsers();
|
||||
for (CanalEventParser singleEventParser : eventParsers) {// 需要遍历启动
|
||||
startEventParserInternal(singleEventParser, true);
|
||||
}
|
||||
} else {
|
||||
startEventParserInternal(eventParser, false);
|
||||
}
|
||||
}
|
||||
|
||||
// around event parser
|
||||
protected void afterStartEventParser(CanalEventParser eventParser) {
|
||||
// noop
|
||||
}
|
||||
|
||||
// around event parser
|
||||
protected void beforeStopEventParser(CanalEventParser eventParser) {
|
||||
// noop
|
||||
}
|
||||
|
||||
protected void afterStopEventParser(CanalEventParser eventParser) {
|
||||
|
||||
boolean isGroup = (eventParser instanceof GroupEventParser);
|
||||
if (isGroup) {
|
||||
// 处理group的模式
|
||||
List<CanalEventParser> eventParsers = ((GroupEventParser) eventParser).getEventParsers();
|
||||
for (CanalEventParser singleEventParser : eventParsers) {// 需要遍历启动
|
||||
stopEventParserInternal(singleEventParser);
|
||||
}
|
||||
} else {
|
||||
stopEventParserInternal(eventParser);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化单个eventParser,不需要考虑group
|
||||
*/
|
||||
protected void startEventParserInternal(CanalEventParser eventParser, boolean isGroup) {
|
||||
if (eventParser instanceof AbstractEventParser) {
|
||||
AbstractEventParser abstractEventParser = (AbstractEventParser) eventParser;
|
||||
// 首先启动log position管理器
|
||||
CanalLogPositionManager logPositionManager = abstractEventParser.getLogPositionManager();
|
||||
if (!logPositionManager.isStart()) {
|
||||
logPositionManager.start();
|
||||
}
|
||||
}
|
||||
|
||||
if (eventParser instanceof MysqlEventParser) {
|
||||
MysqlEventParser mysqlEventParser = (MysqlEventParser) eventParser;
|
||||
CanalHAController haController = mysqlEventParser.getHaController();
|
||||
|
||||
if (haController instanceof HeartBeatHAController) {
|
||||
((HeartBeatHAController) haController).setCanalHASwitchable(mysqlEventParser);
|
||||
}
|
||||
|
||||
if (!haController.isStart()) {
|
||||
haController.start();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected void stopEventParserInternal(CanalEventParser eventParser) {
|
||||
if (eventParser instanceof AbstractEventParser) {
|
||||
AbstractEventParser abstractEventParser = (AbstractEventParser) eventParser;
|
||||
// 首先启动log position管理器
|
||||
CanalLogPositionManager logPositionManager = abstractEventParser.getLogPositionManager();
|
||||
if (logPositionManager.isStart()) {
|
||||
logPositionManager.stop();
|
||||
}
|
||||
}
|
||||
|
||||
if (eventParser instanceof MysqlEventParser) {
|
||||
MysqlEventParser mysqlEventParser = (MysqlEventParser) eventParser;
|
||||
CanalHAController haController = mysqlEventParser.getHaController();
|
||||
if (haController.isStart()) {
|
||||
haController.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user