使用 Java 客户端库配置 PubSub 的消息保留期限

Configure message retention duration of PubSub with Java client library

我在桌面应用程序中使用 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();
   }
}

您可以在 Java 中配置订阅的消息保留期限。创建 Subscription 对象时,可以提供 message_retention_duration field in your creation request. To do this in Java, use 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();
        }
    }
}

注意setMessageRetentionDuration取一个Duration as parameter, so you might need to use Durations helper class (fromMillis method for example) to convert your milliseconds to a protobuf Duration. Note also that from the REST resource documentation,这个字段:

Cannot be more than 7 days or less than 10 minutes.