public async Task <Message> SendMessage(Message msg) { var qm = new QueuedMessage(msg); _messageQueue.Add(qm); using (qm.autoReset = new AutoResetEvent(false)) { msg.SendMessage(this); await qm.autoReset.WaitOneAsync(); } return(qm.reply); }
public async Task <Message> SendMessage(Message msg) { int retries = 0; var qm = new QueuedMessage(msg); lock (_messageQueue) { _messageQueue.Add(qm); } try { using (qm.autoReset = new AutoResetEvent(false)) { while (qm.reply == null) { if (retries > 0) { lock (_messageQueue) { _messageQueue.Remove(qm); _messageQueue.Add(qm); } // Log.Warning("Retrying " + qm.msg.id + " " + qm.msg.command); msg.SendMessage(this); } else { msg.SendMessage(this); } await qm.autoReset.WaitOneAsync(Config.local.network_message_timeout); if (qm.reply == null || (!string.IsNullOrEmpty(qm.reply.data) && qm.reply.data.Contains("\"error\":\"jwt must be provided\""))) { qm.autoReset.Reset(); retries++; qm.reply = null; if (msg.command == "insertorupdateone") { var data = JObject.Parse(msg.data); var _id = data["item"].Value <string>("_id"); var state = data["item"].Value <string>("state"); if (state == "running" || state == "idle") { throw new Exception("Failed updating object"); } Log.Warning("Message timed out " + qm.msg.id + " " + qm.msg.command + " id:" + _id + " state: " + state); } else { Log.Warning("Message timed out " + qm.msg.id + " " + qm.msg.command); } } else { retries = 0; } } } } catch (Exception ex) { Log.Error(ex.ToString()); } if (retries > 0) { Log.Error("Gave up on " + qm.msg.id + " " + qm.msg.command); } return(qm.reply as Message); }