有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Google发布/订阅重用现有订阅

我已经根据下面的pub/sub doc创建了java pub/sub消费者

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();
            }
        }
    }

它工作得很好,但每次运行它都会通过抛出StatusRuntimeExceptionexception请求一个新的订户名称

io.grpc.StatusRuntimeException: ALREADY_EXISTS: Resource already exists in the project (resource=ssvp-sub).

(请参见我的代码片段中的SubscriptionName.create(pubSubProjectName,“ssvp sub”)行)

我是在诺德发现的。js客户端我们可以通过“ReuseeExisting: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) 个答案

  1. # 1 楼答案

    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.
    

    通常情况下,用户会在启动订阅服务器之前(通过云控制台或gcloud CLI)创建订阅,因此您甚至可能希望执行getSubscription()调用,并无论如何抛出异常。如果订阅被删除,您可能希望引起注意,并明确地处理它,因为它会产生影响(例如消息不再被存储以发送给订阅)

    但是,如果您正在构建一个缓存服务器,而该服务器在启动和运行时只需要临时获取更新,那么在启动时创建订阅可能是有意义的