public static async Task DoMessage()
{
const int numberOfMessages = 10;
queueClient = new QueueClient(ConnectionString, QueueName);
await SendMessageAsync(numberOfMessages);
await queueClient.CloseAsync();
}
private static async Task SendMessageAsync(int numOfMessages)
{
try
{
for (var i = 0; i < numOfMessages; i++)
{
var messageBody = $"Message {i}";
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
message.SessionId = i.ToString();
await queueClient.SendAsync(message);
}
}
catch (Exception e)
{
}
}
这是我使用会话ID将消息发送到服务总线队列的示例代码。
我的问题是,如果我调用DoMessage函数2次:让它们分别命名为MessageSet1和MessageSet2。 MessageSet2是否会由接收到的消息接收端的azure函数接收和处理。
我希望像MessageSet1那样按顺序处理MessageSet2,除非MessageSet1完成,否则永远不会处理MessageSet2。
答案 0 :(得分:0)
你正在做的事情有几个问题。
首先,Azure Functions目前不支持会话。您可以跟踪issue。
其次,您正在创建的会话已关闭。应使用相同的SessionId
对一组消息应用会话。这意味着您的for
循环应该为该集合中的所有消息分配相同的SessionId
。像这样:
private static async Task SendMessageAsync(int numOfMessages, string sessionID)
{
try
{
var tasks = new List<Task>();
for (var i = 0; i < numOfMessages; i++)
{
var messageBody = $"Message {i}";
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
message.SessionId = sessionId;
tasks.Add(queueClient.SendAsync(message));
}
await Task.WhenAll(tasks).ConfigureAwait(false);
}
catch (Exception e)
{
// handle exception
}
}
有关使用会话的已订阅消息,请参阅文档here。