我想对订阅执行同步提取操作,并希望等到至少一条消息可用。我使用此代码:
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)。
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))));