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

时间:2018-11-30 10:35:12

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

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

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

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

  

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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))));