[英]Azure Service Bus - cancelled scheduled messages getting re-queued
我正在为 Azure 服务总线使用最新的 Java 绑定 (v3.1.3): https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/servicebus
当我创建一个新的队列客户端时,安排一条消息,然后取消它......
QueueClient sendClient = new QueueClient(new ConnectionStringBuilder(connectionString, queueName), ReceiveMode.PEEKLOCK);
long sequenceNumber = sendClient.scheduleMessage(message, instant);
...
sendClient.cancelScheduledMessage(sequenceNumber)
...代码似乎按预期工作:活动消息计数变为 0。但是一旦预定的消息到达预定的时间(我在未来测试了 10 秒和 100 秒),消息有时会使用新的序列号重新排队。 在安排或取消消息时我没有收到任何错误。 我可以做些什么来确保取消的消息不会重新排队吗?
从我自己的测试中,我发现在预定消息发送到服务总线队列后的短时间内取消服务总线消息并不总是按预期处理取消。 一般来说,我们只谈了几秒钟,但行为并不完全一致。
我的结论是,预定消息排队到注册取消同一消息时会有一些延迟,这意味着在将预定消息发送到队列后几乎立即取消预定消息并不总是会停止处理。
因此,在我的环境中,我必须提供自己的后备功能来检查服务总线消息中的其他自定义属性,因此当它返回我的订阅者应用程序时,我使用 IF 语句检查自定义属性的状态,以便我可以选择是否忽略它并且不再处理任何东西。
这真的让我困惑了一会儿,因为我的环境相当复杂,我认为我的代码中某处存在一些问题,最后,一旦我考虑了上述因素并开始查看服务总线是如何运行的响应计划消息取消,我能够克服这个问题。
您可以通过在通过常规发送路径发送消息时设置ScheduledEnqueueTimeUtc
属性来安排消息,也可以使用ScheduleMessageAsync
API 显式ScheduleMessageAsync
。 后者立即返回预定消息的SequenceNumber ,您可以稍后使用它来取消预定消息(如果需要)。
取消已发送的预定消息的入队(如果尚未入队)。 这是一个异步方法,返回一个
CompletableFuture
,它在消息被取消时完成。
所以,我建议你可以使用cancelScheduledMessageAsync
来取消预定的消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.