我使用Azure Service Bus Queue并启用了基于会话的消息传递。要从队列中使用,我注册IMessageSessionAsyncHandler
,然后使用OnMessageAsync
方法处理消息。
我发现的这个问题是,如果我因任何原因放弃了一条消息,而不是立即再次收到消息,我会收到会话中的下一条消息,并且只有在处理完该消息后才会收到第一条消息再次(假设会话中只有两条消息)。
举个例子,假设我有一个包含2条消息的队列,两者都有相同的SessionId
。这两条消息的序列号分别为1和2。正如预期的那样,我开始接收并获得序列1的消息。如果我然后使用message.Abandon
放弃此消息(放弃的原因无关紧要),我立即在会话中获取下一条消息(序列号2)。只有在处理(或放弃)第二条消息后,才能再次收到第一条消息。
我看到的这种行为并不是我对放弃消息所期望的,并且与其他使用队列的方式不一致。我在以下场景中测试了同样的例子
IMessageSessionAsyncHandler
而只是手动接受消息会话。在这两种情况下,我都看到了预期的行为,因为当我放弃一条消息时,它始终保证是收到的下一条消息,除非超出最大交付数量并且它已经过去了。
我的问题是:我期望使用IMessageSessionAsyncHandler
预期的行为,或者这是服务总线库中的错误?如果这不是一个错误,任何人都可以解释为什么这与其他接收方式有所不同吗?
答案 0 :(得分:1)
在Queueclient上注册会话处理程序时,会在内部打开Prefetch以改善接收器的延迟和吞吐量。不幸的是,对于IMessageSessionAsyncHandler方案,无法覆盖此行为。一种选择是在会话中遇到需要放弃的消息时放弃会话本身,这将确保按顺序传递消息。