如何在CLJS应用中实现Kafka消费者?含Boot集成等问题
解决方案:Boot集成shadow-cljs + Kafkajs Extern文件生成
一、Boot与shadow-cljs集成方案
无需替换现有Boot生产构建流程,只需让shadow-cljs负责CLJS编译环节,Boot继续处理资源打包、部署等其他任务,步骤如下:
添加shadow-cljs依赖到Boot项目
在build.boot中引入shadow-cljs:(set-env! :dependencies '[[thheller/shadow-cljs "2.28.1"]])配置shadow-cljs编译规则
在项目根目录创建shadow-cljs.edn,定义浏览器端CLJS编译目标:{:dependencies [[kafkajs "2.2.4"]] :builds {:app {:target :browser :output-dir "resources/public/js" :modules {:main {:entries [your.app.namespace]}}}}}在Boot中封装shadow-cljs编译任务
在build.boot中定义触发编译的任务:(require '[shadow.cljs.devtools.api :as shadow]) (deftask compile-cljs "用shadow-cljs编译CLJS代码" [] (with-pass-thru _ (shadow/release :app))) ; 开发环境替换为(shadow/watch :app)整合进Boot构建流水线
将compile-cljs加入现有生产构建流程:(deftask build [] (comp (compile-cljs) (pom) (jar) (install)))
这样Boot依然作为构建入口,shadow-cljs仅负责CLJS编译,完全兼容现有生产环境。
二、Kafkajs 2.2.4 Extern文件生成方案
若坚持手动维护extern文件,可采用以下两种方法:
方法1:利用Closure Compiler自动生成
- 编写调用kafkajs核心API的CLJS测试脚本(如创建消费者、订阅主题、拉取消息)
- 用Closure Compiler的
--generate_externs参数生成基础extern:java -jar closure-compiler.jar --generate_externs kafkajs-externs.js --js your-test-script.js - 从生成文件中整理出kafkajs核心类与方法,示例:
/** @constructor */ function Kafka() {} /** @param {!Object} config */ Kafka.prototype.consumer = function(config) {}; KafkaConsumer.prototype.subscribe = function(config) {}; KafkaConsumer.prototype.run = function(callback) {};
方法2:手动编写简化版extern
参考kafkajs官方API文档,直接编写核心功能的extern:
// kafkajs-externs.js /** @type {function(!Object): Kafka} */ var Kafka; /** @constructor */ function Kafka() {} /** * @param {!{groupId: string, brokers: !Array<string>}} config * @return {KafkaConsumer} */ Kafka.prototype.consumer = function(config) {}; /** @constructor */ function KafkaConsumer() {} /** * @param {!{topics: !Array<string>}} params * @return {!Promise<void>} */ KafkaConsumer.prototype.subscribe = function(params) {}; /** * @param {!{eachMessage: function(!{message: !{value: string}}): !Promise<void>}} handlers * @return {!Promise<void>} */ KafkaConsumer.prototype.run = function(handlers) {};
在Boot的CLJS编译任务中指定该extern文件:
(deftask compile-cljs-old [] (cljs :externs ["kafkajs-externs.js"] :optimizations :advanced))
额外建议
集成shadow-cljs后可省去手动维护extern的麻烦,它会自动处理ES模块的extern,直接在CLJS中引入kafkajs即可:
(ns your.app.namespace (:require ["kafkajs" :as kafka])) (def consumer (.consumer (kafka/Kafka. #js {:groupId "my-group" :brokers ["localhost:9092"]})))
内容的提问来源于stack exchange,提问作者ctrl_dev
相关产品推荐
相关产品推荐

