【问题标题】:Configure message retention duration of PubSub with Java client library [closed]使用 Java 客户端库配置 PubSub 的消息保留持续时间 [关闭]
【发布时间】:2019-08-09 17:20:58
【问题描述】:

我在我的桌面应用程序中使用google cloud pubsub java library。我为特定主题创建订阅并从中接收数据。我想知道是否可以配置订阅的消息保留时间。我在任何地方都找不到它。谢谢。

为了让问题更清楚,我粘贴了我用来创建订阅的代码块:

String topicName = "some-topic";
String subscriptionName = "some-subscription";
ProjectTopicName topic = ProjectTopicName.of(PROJECT_ID, topicName);
ProjectSubscriptionName subscription = ProjectSubscriptionName.of(PROJECT_ID, subscriptionName);
SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create(); // I reuse this object so I create it in advance
try {
   subscriptionAdminClient.createSubscription(subscription,
        topic,
        PushConfig.getDefaultInstance(),
        0
   );
} catch (ApiException e) {
   if (e.getStatusCode().getCode() != StatusCode.Code.ALREADY_EXISTS) {
        subscriptionAdminClient.close();
   }
}

【问题讨论】:

  • 这里的信息似乎不足以准确回答您的问题。查看我们的minimal reproducible example 指南,并编辑您的问题以添加更多详细信息。向我们展示您尝试了什么,为什么它对您不起作用,并仔细检查您是否有一个可以回答的具体、客观的问题。

标签: java google-cloud-pubsub


【解决方案1】:

您可以在 Java 中配置订阅的消息保留期限。创建Subscription 对象时,您可以在创建请求中提供message_retention_duration field。要在 Java 中执行此操作,请使用 setMessageRetentionDuration method on Subscription.Builder 对象,如本例所示(使用 com.google.cloud:google-cloud-pubsub:1.86.0 依赖项):

package com.example;

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.pubsub.v1.Subscription;
import com.google.pubsub.v1.TopicName;

import com.google.protobuf.util.Durations;

import java.io.IOException;

public class PubSubCreateSubscription {

    static Subscription createSubscriptionWithMessageRetentionDuration(
        String topicName,
        String subscriptionName,
        long messageRetentionDurationInMillis
    ) throws IOException {
        try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
            Subscription request = Subscription.newBuilder()
                .setName(subscriptionName)
                .setTopic(topicName)
                .setMessageRetentionDuration(Durations
                    .fromMillis(messageRetentionDurationInMillis))
                .build();

            return subscriptionAdminClient
                .createSubscription(request);
        }
    }

    public static void main(String[] args)
    {
        String topicName = "projects/[PROJECT]/topics/[TOPIC_NAME]";
        String subscriptionName = "projects/[PROJECT]/subscriptions/[SUBSCRIPTION_NAME]";

        try {
            Subscription mySubscription = createSubscriptionWithMessageRetentionDuration(
                topicName,
                subscriptionName,
                600000 // 600 000 ms = 10 minutes
            );
            // [...]
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意setMessageRetentionDurationDuration 作为参数,因此您可能需要使用Durations helper class(例如fromMillis 方法)将毫秒转换为protobuf Duration。还要注意from the REST resource documentation,这个字段:

不能超过 7 天或少于 10 分钟。

【讨论】:

  • 这就是我要找的!非常感谢!
猜你喜欢
  • 2020-12-18
  • 2017-01-18
  • 2017-07-25
  • 2020-03-22
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2018-08-11
  • 2010-09-20
相关资源
最近更新 更多