Kotlin项目结合Apache Beam使用协程时出现AbstractGoogleClient警告如何解决?
问题解决方法
问题根因
- 你看到的
AbstractGoogleClient告警来自BeamPubsubIO底层依赖的Google Cloud Java SDK,并非你代码直接调用产生 - 额外嵌套
runBlocking会改变协程上下文环境,导致Beam初始化Pub/Sub客户端时,无法读取到默认的应用名配置,每次客户端初始化/重试都会触发告警,所以会持续刷屏
解决方案
方案1:移除多余的runBlocking(优先推荐)
Kotlin 1.3及以上版本的suspend fun main已经由编译器默认提供了协程运行环境,不需要手动嵌套runBlocking。你可以直接使用coroutineScope获取当前作用域启动后台任务:
@Suppress suspend fun main(args: Array<String>) = coroutineScope { launch { while (true) { delay(1000L) println("Testing...") } } val options = PipelineOptionsFactory.fromArgs(*args).withValidation().`as`(PipelineOptions::class.java) val p = Pipeline.create(options) p.apply<PCollection<String>>( "Read messages from Pub/Sub", PubsubIO.readStrings().fromSubscription(options.inputSubscription) ) .apply("Processing", ParDo.of(ProcessData())) p.run().waitUntilFinish() }
注意这里需要给p.run()加上waitUntilFinish(),避免主协程执行完直接退出。
方案2:显式设置应用名
如果需要保留runBlocking写法,可以显式给Google SDK设置应用名,有两种实现方式:
- 通过GcpOptions配置:
val options = PipelineOptionsFactory.fromArgs(*args).withValidation().`as`(GcpOptions::class.java) options.appName = "自定义应用名" // 后续Pipeline创建逻辑不变
- 启动时设置系统属性:
在main函数最开头添加:
System.setProperty("google.api.client.app.name", "自定义应用名")
方案3:屏蔽告警日志(临时 workaround)
如果不想修改业务代码,可以调整日志级别屏蔽该类告警,以logback为例,添加如下配置:
<logger name="com.google.api.client.googleapis.services" level="ERROR" />
该方法仅屏蔽日志输出,没有解决实际的配置缺失问题。
内容的提问来源于stack exchange,提问作者Zat42
相关产品推荐
相关产品推荐

