/// <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; }
/// <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); }