Приемник данных очереди служебной шины Azure

У меня есть следующая функция ProcessQueueMessage, которая собирает сообщения из очереди служебной шины:

    public static void ProcessQueueMessage([ServiceBusTrigger("dsique2")] BrokeredMessage message,
        TextWriter logger)
    {
        logger.WriteLine($"Processing message: {message}");
        Stream stream = message.GetBody<Stream>();
        StreamReader reader = new StreamReader(stream);
        string s = reader.ReadToEnd();
        //Parse json
        string output = s.Substring(s.IndexOf('{') , s.IndexOf('}') - s.IndexOf('{') + 1);
         var  json = JsonConvert.DeserializeObject<dynamic>(output);
         var TS = Convert.ToDouble(json.ts);
         var Speed = Convert.ToDouble(json.speed);
         var Ped = Convert.ToDouble(json.ped);
         var BrakePed = Convert.ToDouble(json.brakeped);
         var lateralAcc1 = Convert.ToDouble(json.lateralacc1);
         var steeringAngle = Convert.ToDouble(json.steeringangle);
         //sends parsed values to function 
         Program.receive_emulate(0x415, Speed, TS, "offlineSpeed");
         Program.receive_emulate(0x204, BrakePed , TS, "BrakePed ");
         Program.receive_emulate(0x7D, lateralAcc1 , TS, "lateralAcc1 ");
         Program.receive_emulate(0x92, steeringAngle , TS, "steeringAngle ");
}

По сути, всякий раз, когда данные поступают из очереди служебной шины в формате json, я анализирую json, получаю значения и отправляю каждый сигнал в функцию receive_emulate. Проблема в том, что функция запускается до завершения обработки данных в функции receive_emulate. Я хочу обработать отдельные сообщения и отправить их функциям receive_emulate. Когда функция вернется, возьмите второе сообщение в очереди. К сожалению, мне не удалось этого добиться, любые идеи будут очень признательны. Другой, хотя в документации Azure написано, что Fifo гарантированно находится в очередях служебной шины, я замечаю, что мои сообщения приходят не по порядку. Есть ли возможность получить их в заказанном виде? Большое спасибо


person emkay    schedule 11.07.2017    source источник


Ответы (2)


Если я правильно прочитал ваш код, вы используете Функции Azure с триггером служебной шины.

Попробуйте установить для параметра maxConcurrentCalls значение 1 в hosts.json файле, который показан здесь.

Максимальное количество одновременных вызовов обратного вызова, которое должен инициировать насос сообщений. По умолчанию - 16.

person Mikhail Shilkov    schedule 11.07.2017
comment
Разобрались. Большое спасибо - person emkay; 12.07.2017

Как указал @Mikhail, установка concurrency на единицу позволит вам обрабатывать ваши сообщения последовательным способом либо через host.json вы можете

Я сосредоточусь на вашем втором вопросе о FIFO. Служебная шина Azure не гарантирует порядок сообщений, если вы не используете Сеансы обмена сообщениями. Насколько мне известно, сеансы служебной шины являются в настоящее время не поддерживается функциями.

person Sean Feldman    schedule 11.07.2017
comment
Действительно, отсутствие поддержки сессий в Функциях - большая проблема для нас ... - person Mikhail Shilkov; 11.07.2017