google-cloud-platform - 拉取请求上的 GCP Pub/Sub 过滤
问题描述
我想利用与 GCP CLI 类似的拉取请求来进行 Pub/Sub 订阅:
gcloud pubsub 订阅 pull --filter
我希望在 Java 客户端库中利用相同的功能。
有没有办法做到这一点?
谢谢你。
解决方案
中的--filter
选项gcloud
不是 Pub/Sub 或服务固有的东西,而是gcloud
命令基础设施本身提供的实用程序。过滤完全在客户端完成。另请注意,这仅影响消息列表的显示,而不影响实际返回的消息。如果您运行gcloud topic filters
,您可以看到有关此功能的更多详细信息:
大多数 gcloud 命令会在成功时返回资源列表。默认情况下,它们会漂亮地打印在标准输出上。--format=NAMEATTRIBUTES 和 --filter=EXPRESSION 标志以及投影可用于格式化默认输出并将其更改为更有意义的结果。
因此,如果您想在 Java 中执行此操作,则需要编写代码以在接收消息时应用过滤器。基于Java asynchronous pull sample,您需要将消息接收器更改为:
private boolean shouldProcessMessage(PubsubMessage message) {
// Change to perform whatever filtering you want on messages
// to determine if they should be processed.
return true;
}
private void processMessage(PubsubMessage message) {
// Put logic here to handle the message.
}
...
MessageReceiver receiver =
(PubsubMessage message, AckReplyConsumer consumer) -> {
if (shouldProcessMessage(message)) {
processMessage(message);
}
consumer.ack();
};
这是假设您不希望再次发送与您的过滤器不匹配的消息。如果您确实希望再次发送它们,则需要调用consumer.nack()
这些消息而不是consumer.ack()
.
如果您要对消息属性进行所有过滤,那么您可以利用Pub/Sub 的内置过滤。此功能允许您检查属性是否存在,检查属性值是否相等,以及检查属性值的前缀。这种类型的过滤器被声明为订阅创建的一部分,因此除非您以编程方式创建订阅,否则您不会有任何与之关联的 Java 代码。如果您使用这种类型的过滤,与过滤器不匹配的消息不会传递给您的订阅者,因此您MessageReceiver
不需要检查它是否应该处理此类消息;它可以假设它收到的唯一消息是与过滤器匹配的消息。
推荐阅读
- r - 如何获取有关已识别点的信息并将其排除在 R 的下一个图中
- spring-integration - 为什么使用控制总线发送消息时spring集成的errorChannel中没有捕获到异常
- mysql - 使用查询执行请求 Eclipse 时 BIRT 出错
- apache-spark - 通过 Spark 的 Hive JDBC 连接(Nullpointer 异常)
- node.js - 从节点js中的树数组构建平面数组
- python - 如何在散景中点击获取 x 坐标和 y 坐标
- android - Google 的 ARCore 是否/可以在 Kindle 上运行?
- sqlite - 更改表 SQLLITE
- ios - 使用 AVQueuePlayer ios swift 在控制器中未调用接近传感器通知
- offset - 什么是 NTP 服务器中的时钟偏移