2017-07-11 1 views
0

je suit la fonction ProcessQueueMessage qui rassemble les messages de la file d'attente de bus de service:Azure récepteur de données de file d'attente de bus service

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 "); 
} 

Donc, en gros, chaque fois que les données proviennent de la file d'attente de bus de service en tant que format JSON, je parse le JSON, obtenir des valeurs et envoyé chaque signal à la fonction receive_emulate. Le problème est que la fonction est déclenchée avant la fin du traitement des données dans la fonction receive_emulate. Ce que je veux faire est de traiter un seul message et de l'envoyer aux fonctions receive_emulate. Lorsque la fonction revient, prenez le second message dans la file d'attente. Malheureusement, je ne pouvais pas faire cela, toute idée serait profondément appréciée. Un autre même s'il est écrit que Fifo est garanti dans les files d'attente de bus de service dans la documentation azure, je remarque que mes messages ne viennent pas dans l'ordre. Y at-il un moyen de les obtenir sous forme ordonnée? Merci beaucoup

Répondre

1

Si je lis correctement votre code, vous utilisez Azure Functions avec le déclencheur Service Bus.

Essayez de définir le paramètre maxConcurrentCalls sur 1 dans le fichier hosts.json, qui est affiché here.

Le nombre maximal d'appels simultanés au rappel, le message doit être lancé. La valeur par défaut est 16.

+0

Déclassé. Merci beaucoup – emkay

1

Tout comme @Mikhail a souligné, à une mise en concurrence vous permettra de traiter vos messages de manière série, soit par host.json vous pouvez

Je vais me concentrer sur votre deuxième question sur FIFO. Azure Service Bus ne garantit pas l'ordre des messages, sauf si vous utilisez Messaging Sessions. Autant que je sache, les sessions de bus de service sont not currently supported avec des fonctions.

+0

En effet, le manque de support de session dans Functions est un gros problème pour nous ... – Mikhail