我有一个扩展的应用程序,其中每个实例都连接到具有相同名称的azure服务总线订阅。最终的结果是,只有一个实例可以对任何给定的消息执行操作,因为它们都在侦听同一个订阅。
有时,应用程序需要将实例置于空闲状态(服务结构ActiveSecondary副本(。发生这种情况时,我需要关闭订阅,以便此实例不再接收消息。如果最初有两个实例,那么一旦其中一个实例进入空闲状态,所有消息都应该转到其余实例。这一点非常重要,以便所有消息都由正确配置的主实例处理。
当实例变为空闲时,取消令牌将被取消。我有代码在侦听取消,并在最初创建订阅时生成的SubscriptionClient上调用Close((。
问题是,即使在我对一个实例调用Close((之后,消息仍然在它和主实例之间随机分配。
我这样做的方式本身就是错误的,还是我的代码中的其他东西导致了这种行为?
Azure服务总线跟踪0和1 SDK不支持CancellationTokens。如果你关闭了你的客户端,消息将不会被处理,当它们再次可见时,它们将被另一个竞争实例接收。这就是MaxLockDuration
和MaxDeliveryCount
的重要性,以确保消息有足够的处理尝试来说明您所描述的情况,而不需要等待太长时间。
忽略此帖子。事实证明,我在一个实例中使用了两次相同的订阅名称,所以他们在争夺活动。close((函数按预期工作。