如何使用SubscriberServiceApiClient.Pull()取消C#客户端库的同步请求请求?

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

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

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

根据立即返回设置为false时的api documentation,客户端可以取消请求。从该文档中:

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

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

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

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

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

c# google-cloud-platform google-cloud-pubsub
1个回答
0
投票

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))));
© www.soinside.com 2019 - 2024. All rights reserved.