【发布时间】:2016-03-25 21:21:10
【问题描述】:
我们正在使用 Microsoft Azure 服务总线来发送命令消息,并且我们正在使用 OnMessage 方法从总线中获取它们。在我们的 IMessageSessionAsyncHandler.OnMessageAsync 实现中,我们可能意识到消息尚未准备好进行处理。所以我想从总线上获取消息并将它们读到队列的末尾。 get/readd 操作必须是原子的。我怎样才能做到这一点?
这是我目前的解决方案(高度抽象),但我担心非原子性。
queueClient.RegisterSessionHandlerFactory(new CommandSessionHandlerFactory(queueClient), ...);
internal class CommandSessionHandlerFactory : IMessageSessionAsyncHandlerFactory
{
private readonly QueueClient _queueClient;
public CommandSessionHandlerFactory(QueueClient queueClient)
{
_queueClient = queueClient;
}
public IMessageSessionAsyncHandler CreateInstance(MessageSession session, BrokeredMessage message)
{
return new CommandSessionHandlerAsync(_queueClient);
}
}
internal class CommandSessionHandlerAsync : MessageSessionAsyncHandler
{
private readonly QueueClient _queueClient;
public CommandSessionHandlerAsync(QueueClient queueClient)
{
_queueClient = queueClient;
}
protected override async Task OnMessageAsync(MessageSession session, BrokeredMessage message)
{
if (!messageReadyForProcessing)
{
// How to get the following code transactional safe?
var clonedMessage = message.Clone();
await message.CompleteAsync();
await _queueClient.SendAsync(clonedMessage);
}
}
}
那么重复检测呢?我们是否必须更改克隆消息的 MessageId 以确保服务总线重复检测不会丢弃克隆消息?
【问题讨论】:
标签: azureservicebus