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