Mee*_*ack 1 java google-cloud-platform google-cloud-pubsub
我创建了依赖于以下 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它运行良好,但每次运行它都会通过抛出StatusRuntimeException异常来要求一个新的订阅者名称。
io.grpc.StatusRuntimeException: ALREADY_EXISTS: Resource already exists in the project (resource=ssvp-sub).
Run Code Online (Sandbox Code Playgroud)
(请参阅我的代码片段中的 SubscriptionName.create(pubSubProjectName, "ssvp-sub") 行)
我发现在 node.js 客户端中,我们可以通过“reuseExisting:true”选项来重用现有订阅:
topic.subscribe('maybe-subscription-name', { reuseExisting: true }, function(err, subscription) {
// subscription was "get-or-create"-ed
});
Run Code Online (Sandbox Code Playgroud)
如果我使用官方 java pubsub 客户端,我应该通过什么选项?:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-pubsub</artifactId>
<version>0.13.0-alpha</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
乐观呼吁:
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.
Run Code Online (Sandbox Code Playgroud)
通常情况下,通常会在启动订阅者本身之前创建订阅(通过 Cloud Console 或 gcloud CLI),因此您甚至可能想要进行getSubscription()
调用并无论如何都抛出异常。如果订阅被删除,您可能希望引起注意这种情况并明确处理它,因为它具有影响(例如不再存储消息以传递给订阅的事实)。
但是,如果您正在执行诸如构建缓存服务器之类的事情,该服务器只需要在启动和运行时暂时获取更新,那么在启动时创建订阅可能是有意义的。
归档时间: |
|
查看次数: |
1429 次 |
最近记录: |