【发布时间】:2021-10-18 14:45:37
【问题描述】:
我创建订阅者以从 pubSub 主题同步拉取消息。我使用了文档example中的确切设置。
但是,当我尝试关闭订阅者并创建新订阅者时,我遇到了以下问题。
[pool-1-thread-8] ERROR i.g.i.ManagedChannelOrphanWrapper - *~*~*~ Channel ManagedChannelImpl{logId=47567, target=pubsub.googleapis.com:443} was not shutdown properly!!! ~*~*~*
Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true.
java.lang.RuntimeException: ManagedChannel allocation site
at io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference.<init>
(ManagedChannelOrphanWrapper.java:93)
at io.grpc.internal.ManagedChannelOrphanWrapper.<init>(ManagedChannelOrphanWrapper.java:53)
at io.grpc.internal.ManagedChannelOrphanWrapper.<init>(ManagedChannelOrphanWrapper.java:44)
at io.grpc.internal.ManagedChannelImplBuilder.build(ManagedChannelImplBuilder.java:612)
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.
java:261) at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel
(InstantiatingGrpcChannelProvider.java:340)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.access$1600
(InstantiatingGrpcChannelProvider.java:73)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$1.createSingleChannel
(InstantiatingGrpcChannelProvider.java:214)
at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:72)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.
createChannel(InstantiatingGrpcChannelProvider.java:221)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider
.getTransportChannel(InstantiatingGrpcChannelProvider.java:204)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:169)
at com.google.cloud.pubsub.v1.stub.GrpcSubscriberStub.create(GrpcSubscriberStub.java:272)
at eu.hermes.esb.cloud.service.SubService.getSubscriber(SubService.java:48)
at eu.hermes.esb.cloud.runnables.SubTask.run(SubTask.java:31)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
我用于创建和关闭订阅者的代码:
while (compositeConfigurationElement.getSubscriber().isEnabled()) {
SubscriberStub subscriber;
try {
subscriber = subService.getSubscriber(compositeConfigurationElement);
subService.pullAndSend(compositeConfigurationElement, subscriptionName, subscriber);
subscriber.shutdown();
subscriber.awaitTermination(20, TimeUnit.SECONDS);
} catch (DeadlineExceededException e) {
// this is a know issue at the moment ->
// 1- https://github.com/googleapis/google-cloud-java/issues/4220
// 2- https://stackoverflow.com/questions/60012138/google-cloud-function-pulling-from-pub-sub-subscription-throws-exception-deadl
// 3- https://github.com/googleapis/google-cloud-java/issues/3648
log.warn("Deadline exceeded for subscription");
} catch (Exception e) {
log.error("Exception with the subscription service", e);
try {
TimeUnit.SECONDS.sleep(10);
} catch (Exception e2) {
log.error("Exception during wait", e2);
}
}
}
那么,如何摆脱这个错误信息?和 尽管我捕获了所有异常,但究竟是如何抛出这个异常的。
我正在使用 google-cloud-pubsub:1.110.3
【问题讨论】:
-
其实我认为这是拉消息的推荐方法。它创建一个订阅者并拉取然后将其关闭。我在某处的文档中读到它。我认为这不会发生,因为我正在创建和关闭订阅者,因为我正在关闭订阅者。所以,这不应该给我这个错误消息,说请关闭订阅者。
标签: java google-cloud-platform grpc google-cloud-pubsub