我正在使用GCP提供的Vert.X和Bigtable客户端库。查询数据的调用是从工作池/executeBlocking发出的。但是,我收到的AsyncResult是null,经过一段时间后,警告日志就会被打印出来,因为工作线程被阻塞太久了。
等级依赖性:
object Versions {
const val protobuf = "3.20.1"
const val bigtable = "2.5.3"
}
dependencies {
apply(plugin = "io.freefair.lombok")
implementation("com.google.protobuf", "protobuf-java", Versions.protobuf)
implementation("com.google.cloud", "google-cloud-bigtable", Versions.bigtable)
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation("com.fasterxml.jackson.core:jackson-databind:2.14.0")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
implementation(platform("io.vertx:vertx-stack-depchain:$vertxVersion"))
implementation("org.slf4j:slf4j-api:1.7.+")
implementation("ch.qos.logback:logback-classic:1.2.+")
implementation("io.vertx:vertx-config")
implementation("io.vertx:vertx-web")
implementation("io.vertx:vertx-micrometer-metrics")
implementation("io.vertx:vertx-opentracing")
testImplementation("io.vertx:vertx-junit5")
testImplementation("org.junit.jupiter:junit-jupiter:$junitJupiterVersion")
}Bigtable API调用:
vertx.<Row>executeBlocking(t->{
var row=dataClient.readRow(TABLE_ID,"1234#DATA");
t.complete(row);
}).onComplete(r->{
log.info("Result"+r.result());
});下面是日志: 11:36:46.376 vert.x工作者线程-1 INFO StateRepository - StateRepository正在部署
11:36:46.379 vert.x工作者-线程-1 INFO StateRepository - Resultnull
我认为Bigtable客户端在内部创建一个执行器来处理连接,而不是使用初始化它的工作线程池。但这可能完全是另一回事
发布于 2022-11-22 16:31:38
该块是由于bigtable客户端在正常垂直方向上创建的,在进行调用时会阻塞事件循环。将客户端的实例化垂直移动到工人解决了这个问题。

在这里,工作人员垂直应该管理任何阻塞的第三方库的生命周期。
https://stackoverflow.com/questions/74531305
复制相似问题