首页 > 解决方案 > 如何使用 SubscriberServiceApiClient.Pull() 取消与 C# 客户端库的同步拉取请求?

问题描述

我想对订阅执行同步拉取操作,并想等到至少一条消息可用。我使用这段代码:

SubscriberServiceApiClient client = SubscriberServiceApiClient.Create();
SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
PullResponse pullResponse = client.Pull(subscriptionName, returnImmediately: false, maxMessages: 10);

根据api 文档,当returnImmediately设置为false时,客户端可能会取消请求。从该文档中:

如果此字段设置为 true,即使在 Pull 响应中没有可返回的消息,系统也会立即响应。否则,系统可能会等待(一段时间)直到至少有一条消息可用,而不是不返回任何消息。如果客户端不想再等待响应,它可以取消请求。

但是,我看不到如何取消此拉取请求。

当订阅中没有可用消息时,此调用只会阻塞,直到 10 分钟后我收到 RpcException,这是默认的 RPC 到期:

Grpc.Core.RpcException: Status(StatusCode=DeadlineExceeded, Detail="Deadline Exceeded")

此处提出了类似的问题,但答案是针对旧 API 版本上的 Java 客户端。我使用 .NET 客户端的最新 GA 版本 (Google.Cloud.PubSub.V1)。

标签: c#google-cloud-platformgoogle-cloud-pubsub

解决方案


SubscriberServiceApiClient.Pull()方法接受一个可选参数callSettings,例如,您可以这样使用:

SubscriberServiceApiClient client = SubscriberServiceApiClient.Create();
SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
PullResponse pullResponse = client.Pull(
  subscriptionName, returnImmediately: false, maxMessages: 10,
  CallSettings.FromCancellationToken(token));

// you could also specify the maximum time the Pull() method should block:
PullResponse pullResponse = client.Pull(
  subscriptionName, returnImmediately: false, maxMessages: 10,
  CallSettings.FromCallTiming(CallTiming.FromTimeout(TimeSpan.FromSeconds(30))));

推荐阅读