Canal1.1.4服务端原生支持mysql数据变化直接发送至kafka、rocketMQ,但是由于我们的项目是使用的RabbitMQ,故需要对原有框架进行扩展。
以下记录处理过程:
1、下载canal1.1.4源码,详见github:
https://github.com/alibaba/canal.git
2、分析canal deployer模块,发现关键引用:
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.server</artifactId>
<version>${project.version}</version>
</dependency>
3、打开Server模块,发现了MQ的包:
com.alibaba.otter.canal.kafka;
com.alibaba.otter.canal.rocketmq
原有操作类是直接实现了 CanalMQProducer接口,所以此处我们需要新增rabbitMQ操作类也实现该接口;
4、通过查看源码,发现MQ实现类是在deployer模块实现初始化的
找到类:com.alibaba.otter.canal.deployer.CanalStarter
在方法:start中找到关键代码:
if (serverMode.equalsIgnoreCase("kafka")) {
canalMQProducer = new CanalKafkaProducer();
} else if (serverMode.equalsIgnoreCase("rocketmq")) {
canalMQProducer = new CanalRocketMQProducer();
}
在此处初始化刚刚我们新增的rabbitMQ操作类;
5、重新编译打包deployer模块;
补充:
1、扩展配置属性:
com.alibaba.otter.canal.deployer.CanalConstants:定义配置文件配置项;
com.alibaba.otter.canal.common.MQProperties:MQ相关的配置参数;
com.alibaba.otter.canal.deployer.CanalStarter:方法【buildMQProperties】将配置文件关于MQ的属性set到【MQProperties】;