Azure Service总线队列数据接收器

时间:2017-07-11 15:37:57

标签: azureservicebus azure-stream-analytics azure-queues

我有以下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函数。函数返回时,获取队列中的第二条消息。不幸的是,我无法实现这一点,任何想法都将深受赞赏。 另一个虽然写的是Fifo在azure文档中的服务总线队列中得到保证,但我注意到我的消息没有按顺序排列。有没有办法让它们以有序的形式出现? 非常感谢

2 个答案:

答案 0 :(得分:1)

如果我正确阅读了您的代码,那么您正在使用Azure功能和服务总线触发器。

尝试将maxConcurrentCalls参数设置为1文件中hosts.json的{​​{1}},其中显示here

  

回调邮件的最大并发调用数   泵应该启动。默认值为16。

答案 1 :(得分:1)

就像@Mikhail指出的那样,将并发性设置为1将允许您通过https://github.com/Hydrospheredata/mist/blob/master/examples-spark2/src/main/scala/SimpleContext.scala以串行方式处理您的消息

我将专注于关于FIFO的第二个问题。除非您使用host.json,否则Azure Service Bus会保证邮件的顺序。据我所知,Service Bus会话是Messaging Sessions的功能。