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 楼答案
Java库没有一种方法允许用户使用现有订阅调用createSubscription,并且不会引发异常。您有几个选项,这两个选项都涉及使用try/catch块。选择取决于您是否希望对订阅的存在持乐观态度
悲观的呼吁:
乐观的呼吁:
通常情况下,用户会在启动订阅服务器之前(通过云控制台或gcloud CLI)创建订阅,因此您甚至可能希望执行
getSubscription()
调用,并无论如何抛出异常。如果订阅被删除,您可能希望引起注意,并明确地处理它,因为它会产生影响(例如消息不再被存储以发送给订阅)但是,如果您正在构建一个缓存服务器,而该服务器在启动和运行时只需要临时获取更新,那么在启动时创建订阅可能是有意义的