2017-04-20 2 views
1

Ich habe Java Pub/Sub-Verbraucher auf der folgenden Pub/Sub doc erstellt erstellt.Google Pub/Sub wiederverwenden bestehenden Abonnement

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

Es funktioniert gut, aber jeder es für einen neuen subsriber Namen durch das Werfen StatusRuntimeException Ausnahme fragen laufen.

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

(siehe SubscriptionName.create (pubSubProjectName "SSVP-sub") Linie in meinem Code-Schnipsel)

Ich fand heraus, dass in node.js Client wir „reuseExisting passieren kann: true " Option bestehendes Abonnement erneut zu verwenden:

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

Welche Option soll ich übergeben, wenn ich offiziellen Java PubSub Client ?:

verwenden

Antwort

3

Die Java-Bibliothek verfügt nicht über eine Methode, mit der createSubscription mit einem vorhandenen Abonnement aufgerufen werden kann und keine Ausnahme ausgelöst wird. Sie haben mehrere Optionen, die beide einen try/catch-Block verwenden. Die Wahl hängt davon ab, ob Sie über die Existenz des Abonnements optimistisch sein wollen oder nicht.

Pessimistische Aufruf:

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. 

optimistisch Aufruf:

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. 

Im Allgemeinen ist es oft der Fall, dass man das Abonnement vor der Inbetriebnahme die Teilnehmer selbst (über die Cloud Console schaffen würde oder gcloud CLI), also möchten Sie vielleicht sogar den getSubscription() Aufruf ausführen und eine Ausnahme auslösen, egal was passiert. Wenn ein Abonnement gelöscht wurde, möchten Sie möglicherweise auf diesen Fall aufmerksam machen und ihn explizit behandeln, da er Auswirkungen hat (wie die Tatsache, dass Nachrichten nicht mehr gespeichert werden, um an das Abonnement übermittelt zu werden).

Wenn Sie jedoch etwas wie das Erstellen eines Cache-Servers erstellen, der nur vorübergehend Updates erhalten muss, während er läuft, kann das Erstellen des Abonnements beim Start sinnvoll sein.

+0

Eine Anmerkung hier: Wir müssen ApiException anstelle von StatusRuntimeException abfangen. – MeetJoeBlack

+0

Sie haben absolut Recht. Aktualisiert, danke! –

Verwandte Themen