2017-04-20 57 views
1

我已經創建java pub/sub消費者依靠以下pub/sub docGoogle Pub/Sub重用現有的subsription

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

它運作良好,但每次運行它拋出StatusRuntimeException例外詢問新subsriber名稱。

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

(見SubscriptionName.create(pubSubProjectName, 「ssvp子」)在我的代碼片段線)

我發現,在Node.js的客戶端,我們可以通過「reuseExisting:真「選項重用現有的訂閱:

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

我應該通過什麼選擇,如果我用官方Java客戶端訂閱協議?:

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

回答

3

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()調用並拋出一個異常,無論如何。如果一個訂閱被刪除了,你可能想引起注意,並明確地處理它,因爲它具有影響(比如消息不再被存儲以傳遞給訂閱)。但是,如果您正在構建一個緩存服務器,只需要在啓動和運行時暫時獲取更新,那麼在啓動時創建訂閱可能是有意義的。

+0

這裏需要注意一點:我們需要捕獲ApiException而不是StatusRuntimeException。 – MeetJoeBlack

+0

你是絕對正確的。更新,謝謝! –