Quarkus Kubernetes 客户端 - TimeoutException

问题描述 投票:0回答:1

我们已将 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注释的情况下工作

quarkus vert.x smallrye fabric8-kubernetes-client
1个回答
0
投票

当我们在方法上添加

@Blocking
(io.smallrye.common.annotation) 注解时,它就可以工作了。

是的,这是一种解决方法,可以防止在更严格的 Quarkus 3.x 版本中出现此类问题(关于 Vert.x 反应式代码)。

但是在这里做出这种阻塞行为并不是一个好的做法。

最好看看触发异常的代码以便更好地理解。

目前,所有 KubernetesClient 调用都处于阻塞状态。 客户端以同步方式执行对 Kube API 服务器的调用。 您需要使用

@Blocking
注解来阻止该方法的完整逻辑,或者将 KubernetesClient 相关逻辑移至其他位置,以便异步处理。

您可以查看 Repo 的问题以获取更多信息https://github.com/quarkusio/quarkus/issues/38133

© www.soinside.com 2019 - 2024. All rights reserved.