Ejemplo n.º 1
0
        // 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);
        }
Ejemplo n.º 2
0
    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}");
            }
        }
    }