/// <summary>
        /// Invoked when a payload is received from the backplane. There should only be one active call at any time.
        /// </summary>
        /// <param name="streamId">id of the stream</param>
        /// <param name="id">id of the payload within that stream</param>
        /// <param name="messages">List of messages associated</param>
        /// <returns></returns>
        protected Task<bool> OnReceived(string streamId, ulong id, Message[] messages)
        {
            var stream = _streamMappings.GetOrAdd(streamId, _ => new Linktionary<ulong, ScaleoutMapping>());

            var mapping = new ScaleoutMapping();
            stream.Add(id, mapping);

            foreach (var m in messages)
            {
                // Get the payload info
                var info = mapping.EventKeyMappings.GetOrAdd(m.Key, _ => new LocalEventKeyInfo());

                // Save the min and max for this payload for later
                ulong localId = Save(m);

                // Set the topic pointer for this event key so we don't need to look it up later
                info.Topic = _topics[m.Key];

                info.MinLocal = Math.Min(localId, info.MinLocal);
                info.Count++;
            }

            foreach (var eventKey in mapping.EventKeyMappings.Keys)
            {
                ScheduleEvent(eventKey);
            }

            return TaskAsyncHelper.True;
        }
Esempio n. 2
0
        /// <summary>
        /// Invoked when a payload is received from the backplane. There should only be one active call at any time.
        /// </summary>
        /// <param name="streamId">id of the stream</param>
        /// <param name="id">id of the payload within that stream</param>
        /// <param name="messages">List of messages associated</param>
        /// <returns></returns>
        protected Task OnReceived(string streamId, ulong id, Message[] messages)
        {
            // Create a local dictionary for this payload
            var dictionary = new ConcurrentDictionary <string, LocalEventKeyInfo>();

            foreach (var m in messages)
            {
                // Get the payload info
                var info = dictionary.GetOrAdd(m.Key, _ => new LocalEventKeyInfo());

                // Save the min and max for this payload for later
                ulong localId = Save(m);

                // Set the topic pointer for this event key so we don't need to look it up later
                info.Store = _topics[m.Key].Store;

                info.MinLocal = Math.Min(localId, info.MinLocal);
                info.Count++;
            }

            // Create the mapping for this payload
            var mapping = new ScaleoutMapping(dictionary);

            // Get the stream for this payload
            var stream = _streams.GetOrAdd(streamId, _ => new Linktionary <ulong, ScaleoutMapping>());

            // Publish only after we've setup the mapping fully
            stream.Add(id, mapping);

            // Schedule after we're done
            foreach (var eventKey in dictionary.Keys)
            {
                ScheduleEvent(eventKey);
            }

            return(TaskAsyncHelper.Empty);
        }