gpt4 book ai didi

azure - 服务总线 MessageSession 已接受,但接收返回 null

转载 作者:行者123 更新时间:2023-12-02 07:31:52 28 4
gpt4 key购买 nike

我们使用 Azure 服务总线队列,并使用 AcceptMessageSession 接收消息(代码如下)。

接受 MessageSession 成功,但是当我在 MessageSession 上调用 Receive 时,返回 null。

这种情况不会一直发生,而是在队列创建后一段时间后发生。我确认发生这种情况时队列不为空。当我关闭 MessageSession 时,我看到我的队列缩短了(消息数量正确!),但我没有收到消息...

我使用的代码:

public IEnumerable<T> ReceiveBatch<T>(TimeSpan waitTime)
{
MessageSession sessionReceiver = null;
IEnumerable<T> retval;

QueueClient queueClient = GetQueueClient<T>();

try
{
sessionReceiver = queueClient.AcceptMessageSession(waitTime);
retval = ReceiveSessionMessages<T>(sessionReceiver);
}
finally
{
if (sessionReceiver != null) sessionReceiver.Close();
}

return retval;
}

private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver)
{
receiver.PrefetchCount = 10;

BrokeredMessage message;
var retval = new List<T>();
while ((message = receiver.Receive()) != null)
{
var item = message.GetBody<T>();
if (!Equals(item, default(T))) retval.Add(item);
}

return retval;
}

更新:

我怀疑,虽然某个 session 的所有消息都已过期,但 session 本身仍然存在,因此它被接受,但没有收到任何消息。

最佳答案

此处需要考虑的几个事项是,您使用 PrefetchCount 进行隐式批处理,而可以使用 RecieveBatch API 显式获取一组消息。请参阅下面的代码示例。

private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver)
{
var retval = new List<T>();
var messages = receiver.ReceiveBatch(10);
foreach(BrokeredMessage message in messages)
{
var item = message.GetBody<T>();
if (!Equals(item, default(T))) retval.Add(item);
}

return retval;
}

此外,如果您收到 MessageSession 但没有消息,您能否详细说明它们是否已过期?您是否设置了 TimeToLive 值,或者在达到 MaxDeliveryCount 后消息变为死信。

关于azure - 服务总线 MessageSession 已接受,但接收返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16518832/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com