Exemple #1
0
        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);
        }