最近项目中需要对接第三方系统,数据通过kafka传递过来,需要使用到 KafkaAvroDeserializer 来反序列化消息,于是踩坑开始了。
首先,我们设置反序列化工具:
configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class);
但是会发现找不到KafkaAvroDeserializer这个类,然后去pom文件中添加相关的依赖,在网上找的资料发现需要添加四个依赖:
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-schema-registry-client</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>common-utils</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>common-config</artifactId>
<version>5.3.0</version>
</dependency>
但是我们我们的仓库中并没有找到这几个jar包,于是只能从网上把他们下载下来,上传到我们的中央仓库了,上传命令如下:
mvn deploy:deploy-file -Dmaven.test.skip=true -DgroupId=io.confluent -DartifactId=common-config -Dversion=5.3.0 -Dpackaging=jar -Dfile=common-config-5.3.0.jar -Durl=http://xxx/repository/maven-release/
然后就能在pom中直接使用了。
其实如果你不想这么麻烦的话,还有一种简单的方法:
在你的pom文件中添加如下repository和dependency就OK了:
<repositories>
<repository>
<id>confluent</id>
<url>http://packages.confluent.io/maven/</url>
</repository>
</repositories>
</dependencies>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>1.0</version> <!-- Also tried 2.0-SNAPSHOT -->
</dependency>
</dependencies>
但是,你以为这样就完了吗?当然不是,启动项目的时候它就报错了:
Caused by: io.confluent.common.config.ConfigException: Missing required configuration "schema.registry.url" which has no default value.
需要在consumer配置中添加如下配置:
configs.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://localhost:8081");
然后就可以正常使用啦。