我们使用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;
}
更新:
我怀疑虽然某个会话的所有消息都已过期,但会话本身仍然存在,因此它被接受但没有收到任何消息。
答案 0 :(得分:0)
这里要考虑的几个项目,您使用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
后消息会被破坏。