首页 > 解决方案 > 拉取请求上的 GCP Pub/Sub 过滤

问题描述

我想利用与 GCP CLI 类似的拉取请求来进行 Pub/Sub 订阅:

gcloud pubsub 订阅 pull --filter

我希望在 Java 客户端库中利用相同的功能。

有没有办法做到这一点?

谢谢你。

标签: google-cloud-platformgoogle-cloud-pubsub

解决方案


中的--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不需要检查它是否应该处理此类消息;它可以假设它收到的唯一消息是与过滤器匹配的消息。


推荐阅读