private ulong ExtractMessages(int streamIndex, ScaleoutMapping mapping, IList <ArraySegment <Message> > items, ref int totalCount) { // For each of the event keys we care about, extract all of the messages // from the payload lock (EventKeys) { for (var i = 0; i < EventKeys.Count; ++i) { string eventKey = EventKeys[i]; for (int j = 0; j < mapping.LocalKeyInfo.Count; j++) { LocalEventKeyInfo info = mapping.LocalKeyInfo[j]; if (info.MessageStore != null && info.Key.Equals(eventKey, StringComparison.OrdinalIgnoreCase)) { MessageStoreResult <Message> storeResult = info.MessageStore.GetMessages(info.Id, 1); if (storeResult.Messages.Count > 0) { // TODO: Figure out what to do when we have multiple event keys per mapping Message message = storeResult.Messages.Array[storeResult.Messages.Offset]; // Only add the message to the list if the stream index matches if (message.StreamIndex == streamIndex) { items.Add(storeResult.Messages); totalCount += storeResult.Messages.Count; // We got a mapping id bigger than what we expected which // means we missed messages. Use the new mappingId. if (message.MappingId > mapping.Id) { return(message.MappingId); } } else { // REVIEW: When the stream indexes don't match should we leave the mapping id as is? // If we do nothing then we'll end up querying old cursor ids until // we eventually find a message id that matches this stream index. } } } } } } return(mapping.Id); }
private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage) { Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count); _logger.LogInformation(String.Format("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count)); var localMapping = new LocalEventKeyInfo[scaleoutMessage.Messages.Count]; var keys = new HashSet <string>(); for (var i = 0; i < scaleoutMessage.Messages.Count; ++i) { Message message = scaleoutMessage.Messages[i]; // Remember where this message came from message.MappingId = id; message.StreamIndex = streamIndex; keys.Add(message.Key); ulong localId = Save(message); MessageStore <Message> messageStore = Topics[message.Key].Store; localMapping[i] = new LocalEventKeyInfo(message.Key, localId, messageStore); } // Get the stream for this payload ScaleoutMappingStore store = StreamManager.Streams[streamIndex]; // Publish only after we've setup the mapping fully store.Add(id, scaleoutMessage, localMapping); // Schedule after we're done foreach (var eventKey in keys) { ScheduleEvent(eventKey); } }
private void OnReceivedCore(int streamIndex, ulong id, ScaleoutMessage scaleoutMessage) { Counters.ScaleoutMessageBusMessagesReceivedPerSec.IncrementBy(scaleoutMessage.Messages.Count); _logger.LogInformation(String.Format("OnReceived({0}, {1}, {2})", streamIndex, id, scaleoutMessage.Messages.Count)); var localMapping = new LocalEventKeyInfo[scaleoutMessage.Messages.Count]; var keys = new HashSet<string>(); for (var i = 0; i < scaleoutMessage.Messages.Count; ++i) { Message message = scaleoutMessage.Messages[i]; // Remember where this message came from message.MappingId = id; message.StreamIndex = streamIndex; keys.Add(message.Key); ulong localId = Save(message); MessageStore<Message> messageStore = Topics[message.Key].Store; localMapping[i] = new LocalEventKeyInfo(message.Key, localId, messageStore); } // Get the stream for this payload ScaleoutMappingStore store = StreamManager.Streams[streamIndex]; // Publish only after we've setup the mapping fully store.Add(id, scaleoutMessage, localMapping); // Schedule after we're done foreach (var eventKey in keys) { ScheduleEvent(eventKey); } }