(1). Canal逻辑架构图
(2). CanalInstanceWithSpring类的继承图
(3). file-instance.xml内部结构
file-instance.xml 定义了:instance对象的的依赖关系
<bean id="eventParser" class="com.alibaba.otter.canal.parse.inbound.mysql.MysqlEventParser"> <!-- ... --> </bean>
<bean id="eventSink" class="com.alibaba.otter.canal.sink.entry.EntryEventSink"> <!-- ... --> </bean>
<bean id="eventStore" class="com.alibaba.otter.canal.store.memory.MemoryEventStoreWithBuffer"> <!-- ... --> </bean>
<bean id="metaManager" class="com.alibaba.otter.canal.meta.FileMixedMetaManager"> <!-- ... --> </bean>
<bean id="alarmHandler" class="com.alibaba.otter.canal.common.alarm.LogAlarmHandler" />
<bean id="instance" class="com.alibaba.otter.canal.instance.spring.CanalInstanceWithSpring">
<property name="destination" value="${canal.instance.destination}" />
<property name="eventParser">
<ref local="eventParser" />
</property>
<property name="eventSink">
<ref local="eventSink" />
</property>
<property name="eventStore">
<ref local="eventStore" />
</property>
<property name="metaManager">
<ref local="metaManager" />
</property>
<property name="alarmHandler">
<ref local="alarmHandler" />
</property>
</bean>
(4). CanalInstanceWithSpring入口
在前面分析,我们知道:
- SpringCanalInstanceGenerator会创建ApplicationContext加载XML,并从XML获取实例对象:CanalInstanceWithSpring.
- 调用:CanalInstanceWithSpring.start方法
- 在这里,主要剖析CanalInstanceWithSpring.start方法.
(5). CanalInstanceWithSpring.start方法
public void start() {
super.start();
// 元数据管理
if (!metaManager.isStart()) {
metaManager.start();
}
// 告警处理
if (!alarmHandler.isStart()) {
alarmHandler.start();
}
// 事件存储
if (!eventStore.isStart()) {
eventStore.start();
}
// 事件加工处理
if (!eventSink.isStart()) {
eventSink.start();
}
// 事件解析
if (!eventParser.isStart()) {
beforeStartEventParser(eventParser);
eventParser.start();
afterStartEventParser(eventParser);
}
logger.info("start successful....");
}
(6). 总结
启动时依次调用:
CanalMetaManager.start
CanalAlarmHandler.start
CanalEventStore.start
CanalEventSink.start
CanalEventParser.start
只有当所有都准备就绪后:CanalEventParser才能开始启动,自然,关闭是肯定是按相反的方向进行关闭.