【发布时间】:2015-11-03 01:00:36
【问题描述】:
我想将事务与 Azure 服务总线一起使用,但我有一些消息是网络/API 绑定的,我根本无法可靠地进一步重构它们以使它们在 5 分钟内完成 - 允许的最大 PeekLock 持续时间。
我找不到任何允许我扩展锁的 API,所以也许还有另一种模式。
一种可能的解决方案:
1) 使用现有的实现来接收消息。如果从需要长时间运行事务的主题/队列中获取 - 使用新的 ScheduledEnqueueTimeUtc 更新消息并发送回服务总线。
myMessage.ScheduledEnqueueTimeUtc = TimeSpan.FromMinutes(actualLockDuration);
serviceBusClient.PublishMessage(topic, myMessage);
2) 通过 MessageId 获取特定消息并将该新消息标记为完成。
if (oldMessage.LockedUntilUtc > DateTime.UtcNow) {
var message = FetchMessage(oldMessage.MessageId);
message.Complete();
} else {
oldMessage.Complete();
}
再想一想,在寻找通过 messageId 获取消息的 API 之后 - 我没有看到。如果我通过序列 ID 获取,那么我需要一种在步骤 1 之后获取序列 ID 的方法 - 然后我需要重新考虑一些内部系统(大型消息处理、消息记录和关联等)
【问题讨论】:
-
"序列号的范围是队列或主题。该值仅适用于从服务总线接收到的消息。"我将无法使用 Receive(sequenceNumber) API,因为如果我重新发布要稍后获取的消息,我将不知道该号码。
标签: c# azure azureservicebus