c# - 如何使用 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)。
解决方案
该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))));
推荐阅读
- java - WebService类中的Spring Autowired不起作用
- java - 如何在 yaml 文件中访问 ONE HashMap 的嵌套列表?
- html - 不知道是什么导致黄瓜测试失败?
- json - NetSuite SDF VS 代码扩展不起作用
- azure - Azure MARS 代理仍会写入本地硬盘
- android - 不能在活动之间取布尔值
- r - 为什么 R 在安装包时试图编译从 .Rprofile 写入标准输出的字符串?
- git - 在分支上签出时,从 master 拉取并合并或变基到当前分支,然后签出该分支
- python - Django:AttributeError:类型对象'Data_Point'没有属性'objects'
- angular - “导航在 Angular 区域外触发”解释