我们已将 Quarkus 从 2.11.1 升级到 3.6.6。在早期版本 2.11.1 中。 Kubernetes Client 运行顺利,但是在 3.6.6 版本 Kubernetes Client 出现了 Timeout 异常。
异常详细信息 - (vert.x-worker-thread-10) 异步加载期间抛出异常:io.fabric8.kubernetes.client.KubernetesClientException。
当我们在方法上添加 @Blocking(io.smallrye.common.annotation) 注解时,它就可以工作了。但在这里做出这种阻塞行为并不是一个好的做法。
完全例外。
(vert.x-worker-thread-10) Exception thrown during asynchronous load: io.fabric8.kubernetes.client.KubernetesClientException
at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.waitForResult(OperationSupport.java:509)
at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleResponse(OperationSupport.java:524)
at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleGet(OperationSupport.java:467)
at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.handleGet(BaseOperation.java:791)
at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.requireFromServer(BaseOperation.java:192)
at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.get(BaseOperation.java:148)
at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.get(BaseOperation.java:97)
at com.rockwell.idp.security.identity.cache.IdentityProviderCache.getConfigMap(IdentityProviderCache.java:112)
at com.rockwell.idp.security.identity.cache.IdentityProviderCache.lambda$getIdentityProviderDetailsByTenantId$0(IdentityProviderCache.java:103)
at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:36)
at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:43)
at io.smallrye.mutiny.vertx.AsyncResultUni.lambda$subscribe$1(AsyncResultUni.java:35)
at io.smallrye.mutiny.vertx.DelegatingHandler.handle(DelegatingHandler.java:25)
at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
at io.vertx.core.impl.WorkerContext.execute(WorkerContext.java:111)
at io.vertx.core.impl.WorkerContext.execute(WorkerContext.java:53)
at io.vertx.core.impl.WorkerContext.execute(WorkerContext.java:65)
at io.vertx.core.impl.DuplicatedContext.execute(DuplicatedContext.java:184)
at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:51)
at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
at io.vertx.core.Promise.complete(Promise.java:66)
at io.vertx.core.eventbus.impl.ReplyHandler.dispatch(ReplyHandler.java:97)
at io.vertx.core.eventbus.impl.HandlerRegistration$InboundDeliveryContext.execute(HandlerRegistration.java:137)
at io.vertx.core.eventbus.impl.DeliveryContextBase.next(DeliveryContextBase.java:80)
at io.vertx.core.eventbus.impl.DeliveryContextBase.dispatch(DeliveryContextBase.java:43)
at io.vertx.core.eventbus.impl.HandlerRegistration.dispatch(HandlerRegistration.java:98)
at io.vertx.core.eventbus.impl.ReplyHandler.doReceive(ReplyHandler.java:81)
at io.vertx.core.eventbus.impl.HandlerRegistration.lambda$receive$0(HandlerRegistration.java:49)
at io.vertx.core.impl.WorkerContext.lambda$null$1(WorkerContext.java:92)
at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.util.concurrent.TimeoutException
at io.fabric8.kubernetes.client.utils.AsyncUtils.lambda$withTimeout$0(AsyncUtils.java:42)
at io.fabric8.kubernetes.client.utils.Utils.lambda$schedule$6(Utils.java:473)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
... 1 more
期望在不使用@Blocking注释的情况下工作
当我们在方法上添加
(io.smallrye.common.annotation) 注解时,它就可以工作了。@Blocking
是的,这是一种解决方法,可以防止在更严格的 Quarkus 3.x 版本中出现此类问题(关于 Vert.x 反应式代码)。
但是在这里做出这种阻塞行为并不是一个好的做法。
最好看看触发异常的代码以便更好地理解。
目前,所有 KubernetesClient 调用都处于阻塞状态。 客户端以同步方式执行对 Kube API 服务器的调用。 您需要使用
@Blocking
注解来阻止该方法的完整逻辑,或者将 KubernetesClient 相关逻辑移至其他位置,以便异步处理。
您可以查看 Repo 的问题以获取更多信息https://github.com/quarkusio/quarkus/issues/38133