Azure Service Bus Queue:消息的排序如何工作?

时间:2018-04-04 02:35:24

标签: azure queue azure-functions azureservicebus

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。

1 个答案:

答案 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