我们的应用程序有一个常见的用例,其中我们有长期存在的主题,这些主题可能跨越应用程序部署,但也可能不存在。
我们正试图使用提供的Java客户端在GCP pub/sub主题中找到该模式的最佳实践,在该客户端中我们可以创建IfNotExists或GetAndCreateIfNotExtists。
我们目前使用的实现是尝试创建一个Topic,如果它是AlreadyExistsException,则基本上会吞下异常。
@Override
public void createTopicIfNotExists(TopicName topicName) {
try {
this.topicAdminClient.createTopic(topicName);
} catch (AlreadyExistsException e) {
// topic already exists
} catch (Exception e) {
throw e;
}
}
我不认为这是理想的,因为他们基本上使用异常作为逻辑,这本质上是一种糟糕的做法。如果我们试图在主题不存在的情况下获取该主题,则客户端会抛出DoesNot exist异常,因此我们不能以其他方式执行。
我在github上看到过JS客户端能够在Get命令上自动创建的事情,有人知道这在java客户端中是否可用吗。
请参见此处:https://stackoverflow.com/a/38878368/5385625Java客户端中是否存在等效程序。
遗憾的是,此功能在java客户端库中不可用。您可以提交功能请求,因为这是一个潜在的有用功能!
我的建议是,在创建主题之前,可以执行getTopic((来检查主题是否存在,以防止出现异常。
getTopic()
Java文档中的示例代码:
try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
TopicName topic = TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]");
Topic response = topicAdminClient.getTopic(topic.toString());
}
建议的方法是在getTopic
上捕获NotFoundEception
,以便知道何时已经存在主题。以这种方式处理异常是否有特别的问题?