// Elastic messages are combined into a queue so that is only certain numbers of messages is being going // through active HTTP requests at certain point of time. // It assumes you handle requests failures via RequestFailed handlers. // SendElasticMessage returns a SignalNowMessageAction which you can use to check status of the message: // * Waiting us true if message is waiting in the queue // * Started is true if message is being sent // * Cancelled is true if message has been cancelled public SignalNowMessageAction SendElasticMessage(string recipient, bool groupRecipient, string messageType, string messagePayload, bool payloadIsJson = false) { var action = new SignalNowMessageAction(this, recipient, groupRecipient, messageType, messagePayload, payloadIsJson, disconnectingCancel.Token); elasticQueue.Enqueue(action); if (elasticQueueTask == null || elasticQueueTask.IsCompleted) { try { newSendMutex.WaitOne(); if (elasticQueueTask == null || elasticQueueTask.IsCompleted) { elasticQueueTask = Task.Run((Action)ElasticQueueThreadProc); } } finally { newSendMutex.ReleaseMutex(); } } newMessageTaskEvent.Set(); return(action); }
void Send() { if (lastMessageAction != null && lastMessageAction.Waiting) { return; } List <SignalNowTransformableData> toSendTransformable = new List <SignalNowTransformableData>(); while (!outgoingQueue.IsEmpty) { SignalNowData data = null; if (outgoingQueue.TryDequeue(out data) && data != null) { string dataType = data.GetType().Name; if (dataType == typeof(SignalNowTransformableData).Name) { var trans = data as SignalNowTransformableData; var existing = toSendTransformable.Where(t => t.objectName == trans.objectName).FirstOrDefault(); if (existing != null && !string.IsNullOrEmpty(existing.objectName)) { toSendTransformable.Remove(existing); } toSendTransformable.Add(trans); } } } if (toSendTransformable.Count > 0) { try { var settings = new JsonSerializerSettings(); settings.ReferenceLoopHandling = ReferenceLoopHandling.Error; string json = JsonConvert.SerializeObject(toSendTransformable.ToArray(), Formatting.None, settings); lastMessageAction = client.SendElasticMessage(client.GetEveryoneRecipient(), true, typeof(SignalNowTransformableData).Name, json, true); } catch (Exception ex) { Debug.LogError($"Exception when sending an update: {ex.Message}"); } } }