canal与kafka的zkclient版本冲突

9553 [main] ERROR c.a.o.c.c.i.r.ClientRunningMonitor - There is an error when execute initRunning method, with destination [example].
java.lang.AbstractMethodError: com.alibaba.otter.canal.common.zookeeper.ZooKeeperx.writeDataReturnStat(Ljava/lang/String;[BI)Lorg/apache/zookeeper/data/Stat;
	at org.I0Itec.zkclient.ZkClient$10.call(ZkClient.java:817) ~[zkclient-0.3.jar:0.3]
	at org.I0Itec.zkclient.ZkClient.retryUntilConnected(ZkClient.java:675) ~[zkclient-0.3.jar:0.3]
	at org.I0Itec.zkclient.ZkClient.writeDataReturnStat(ZkClient.java:813) ~[zkclient-0.3.jar:0.3]
	at org.I0Itec.zkclient.ZkClient.writeData(ZkClient.java:808) ~[zkclient-0.3.jar:0.3]
	at org.I0Itec.zkclient.ZkClient.writeData(ZkClient.java:777) ~[zkclient-0.3.jar:0.3]
	at com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor.processActiveEnter(ClientRunningMonitor.java:215) [canal.client-1.0.22.jar:na]
	at com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor.initRunning(ClientRunningMonitor.java:118) [canal.client-1.0.22.jar:na]
	at com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor.start(ClientRunningMonitor.java:92) [canal.client-1.0.22.jar:na]
	at com.alibaba.otter.canal.client.impl.SimpleCanalConnector.connect(SimpleCanalConnector.java:93) [canal.client-1.0.22.jar:na]
	at com.alibaba.otter.canal.client.impl.ClusterCanalConnector.connect(ClusterCanalConnector.java:63) [canal.client-1.0.22.jar:na]
	at com.alibaba.otter.canal.client.CanalConnector$connect.call(Unknown Source) [canal.client-1.0.22.jar:na]

canal版本:1.0.22;kafka版本:0.8.2.1;客户端通过CanalConnectors.newClusterConnector(String zkServers, String destination, String username,String password)方法连接canal集群。

错误原因:canal依赖的zkclient版本为0.1;kafka依赖的zkclient版本为0.3;

0.3版本的zkclient在调用writeData方法时,会调用IZkConnection实现类ZooKeeperx(canal.common包)的writeDataReturnStat方法,而canal.client包因为是依赖0.1版本,ZooKeeperx并没有writeDataReturnStat方法。

所以当classloader加载的是0.3版本,调用writeData时,在ZooKeeperx类找不到writeDataReturnStat方法,报AbstractMethodError错误,最终导致连接canal服务端失败。

解决步骤:

  1. canal父工程zkclient版本升级为0.3
    <dependency>
        <artifactId>zkclient</artifactId>
        <groupId>com.101tec</groupId>
        <version>0.3</version>
        <!-- 
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
         -->
    </dependency>

     

  2. ZooKeeperx(com.alibaba.otter.canal.common.zookeeper包下)实现writeDataReturnStat方法。
    @Override
    public Stat writeDataReturnStat(String path, byte[] data, int expectedVersion)
    			throws KeeperException, InterruptedException {
    	_zk.setData(path, data, expectedVersion);
    	return _zk.exists(path, false);
    }

     

  3. 重新打canal.common包。完成,^_^

转载于:https://my.oschina.net/u/134474/blog/827454

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值