我有以下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文档中的服务总线队列中得到保证,但我注意到我的消息没有按顺序排列。有没有办法让它们以有序的形式出现? 非常感谢
答案 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的功能。