当前位置: 首页 > 知识库问答 >
问题:

Google Pub/Sub重用现有订阅

轩辕煜
2023-03-14
public static void main(String... args) throws Exception {

        TopicName topic = TopicName.create(pubSubProjectName, pubSubTopic);
        SubscriptionName subscription = SubscriptionName.create(pubSubProjectName, "ssvp-sub");

        SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create();
        subscriptionAdminClient.createSubscription(subscription, topic, PushConfig.getDefaultInstance(), 0);

        MessageReceiver receiver =
                new MessageReceiver() {
                    @Override
                    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
                        System.out.println("Got message: " + message.getData().toStringUtf8());
                        consumer.ack();
                    }
                };
        Subscriber subscriber = null;
        try {
            subscriber = Subscriber.defaultBuilder(subscription, receiver).build();
            subscriber.addListener(
                    new Subscriber.Listener() {
                        @Override
                        public void failed(Subscriber.State from, Throwable failure) {
                            // Handle failure. This is called when the Subscriber encountered a fatal error and is shutting down.
                            System.err.println(failure);
                        }
                    },
                    MoreExecutors.directExecutor());
            subscriber.startAsync().awaitRunning();

            Thread.sleep(60000);
        } finally {
            if (subscriber != null) {
                subscriber.stopAsync();
            }
        }
    }
io.grpc.StatusRuntimeException: ALREADY_EXISTS: Resource already exists in the project (resource=ssvp-sub).

我发现在Node.js客户机中,我们可以传递“reuseexisting:true”选项来重用现有的订阅:

topic.subscribe('maybe-subscription-name', { reuseExisting: true }, function(err, subscription) {
  // subscription was "get-or-create"-ed
});

如果我使用正式的java pubsub客户机,我应该通过什么选项?:

 <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-pubsub</artifactId>
      <version>0.13.0-alpha</version>
    </dependency>

共有1个答案

汝彭薄
2023-03-14

Java库没有允许使用现有订阅调用createSubscription并且不引发异常的方法。您有几个选项,这两个选项都涉及到使用try/catch块。选择取决于您是否希望对订阅的存在持乐观态度。

悲观的呼声:

try {
  subscriptionAdminClient.createSubscription(subscription, 
                                             topic,
                                             PushConfig.getDefaultInstance(),
                                             0);
} catch (ApiException e) {
  if (e.getStatusCode() != Status.Code.ALREADY_EXISTS) {
    throw e;
  }
}

// You know the subscription exists and can create a Subscriber.

乐观呼吁:

try {
  subscriptionAdminClient.getSubscripton(subscription);
} catch (ApiException e) {
  if (e.getStatusCode() == Status.Code.NOT_FOUND) {
    // Create the subscription
  } else {
    throw e;
  }
}

// You know the subscription exists and can create a Subscriber.
 类似资料:
  • Pub子主题在接收到新消息时调用云函数endpoint。 如果云函数内部发生任何错误,函数将返回一个错误。 null 但是云函数不会再执行了,它只运行了一次。 ACK截止期600秒。最大投递次数6次。从G Cloud控制台配置。

  • Note 本文档翻译自: http://redis.io/topics/pubsub 。 SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息泛型(Publish/Subscribe messaging paradigm), 在这个实现中, 发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端), 而是将信息发送给频道(chann

  • 在什么时候,我会放弃对消息的访问(在保留期内)?,删除所有订阅?保持至少一个活动订阅将允许PubSub添加新订阅和重播旧消息? 我是否也可以增加话题的保留期超过7天? 编辑:消息将保存到DB,但我更感兴趣的是pub/sub架构

  • 在RxJava中,我有一个对象,其中我订阅了。稍后(在调用后的一段时间)我创建了一个新的并使用之前使用的相同实例进行订阅。但是,这似乎不起作用。订阅者不能重用吗? 示例: 在我的代码中,我想实例化一次,并多次调用,例如在用户单击刷新按钮后...

  • 我对GCP Pub/Sub REST API感到困惑。 背景:我正在尝试使用GCP发布/订阅编写一个应用程序,其中该语言不会作为客户端库退出(我正在尝试使用R)。 因此,我需要依赖提供的REST API:https://cloud.google.com/pubsub/docs/reference/rest 根据我对REST API的理解,我们必须使用pull订阅:https://cloud.goo

  • 我有一个简单的python脚本,它使用Google pubsub来检测Google云存储中的新文件。该脚本只需将新消息添加到队列中,另一个线程将在队列中处理这些消息: 这里,简单地将消息添加到队列中: 我遇到的问题是,过了一段时间(可能几天),订阅服务器停止接收新文件通知。如果我停止并重新启动脚本,它会一次获得所有通知。 我想知道是否有其他人也有类似的问题和/或可以建议解决问题的方法(可能通过打印