是处理MessaginEntityNotFoundException更好,还是应该在发送消息之前检查主题是否存在
在Microsoft ServiceBus文档中的代码示例中,以下代码用于确保主题存在是处理MessaginEntityNotFoundException更好,还是应该在发送消息之前检查主题是否存在,exception,azure,azureservicebus,optimistic,Exception,Azure,Azureservicebus,Optimistic,在Microsoft ServiceBus文档中的代码示例中,以下代码用于确保主题存在 // Create the topic if it does not exist already string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); var namespaceManager = NamespaceManager.CreateFrom
// Create the topic if it does not exist already
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager =
NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.TopicExists("TestTopic"))
{
namespaceManager.CreateTopic("TestTopic");
}
但是我想知道,如果我在发送消息之前输入此代码,那么调用TopicExists的费用将有多高。(假设我不想单独使用初始化代码)
另一种方法是乐观地发送消息,而不检查主题是否存在并处理MessaginEntityNotFoundException
。如果出现异常,我们可以创建主题并重试发送消息
第二种方法对我来说似乎更好,但我找不到任何支持它的参考资料。所以我想知道,微软在他们的文档和示例中选择了第一种方法而不是处理异常,这有什么特别的原因吗 需要记住的一点是,您需要管理总线的权限才能创建主题。您可能不想将此级别的权限授予所有客户端,因为这可能会有一点安全风险,例如,客户端可能会创建订阅来读取它不应该看到的消息 在打开客户端连接之前调用TopicExists()并不昂贵,而且会产生更优雅的代码。如果您在创建任何内容之前等待异常被触发,那么您可能会发现手头上有大量失败的消息
我通常有一个单独的过程来创建和更新总线的结构。这是否实用取决于您正在创建的主题和队列的数量。如果它预期它可能找不到:请检查它。如果它是意外的:处理它。@Peter我同意这个想法,但是在这里,第一次,在一个新的环境中,它预计不会被找到,但是在那之后,它是意外的主题不在那里。但是,嗯。。。。这确实是一个不同的情况!您是否有安装/设置或集成过程,将您的软件带入安装/集成/配置过程?或任何类似于安装/集成的启动过程?如果没有,您必须先检查它。如果是,请在集成/安装时进行检查,并在运行时进行处理。@Peter目前没有安装/安装机制,我的策略是在需要的时间和地点创建/验证内容,而不是预先设置所有内容。(或者假设所有的东西都在那里,当出现问题时处理异常)