private void RequestTeams(string recipientId) { if (_teamsToInitialize.IsEmpty) { EndInitialization(); } else { var lockObject = new object(); var serviceBusMessages = ServiceBus.ObservableMessages.Where(m => !string.Equals(m.SenderNodeId, NodeId, StringComparison.OrdinalIgnoreCase)); serviceBusMessages = serviceBusMessages.Synchronize(lockObject); var lastMessageTime = PlanningPoker.DateTimeProvider.UtcNow; var initTeamActions = serviceBusMessages.Where(m => m.MessageType == NodeMessageType.InitializeTeam) .TakeWhile(m => !_teamsToInitialize.IsEmpty) .Select(m => new Action(() => { lastMessageTime = PlanningPoker.DateTimeProvider.UtcNow; ProcessInitializeTeamMessage(m); })); var messageTimeoutActions = Observable.Interval(TimeSpan.FromSeconds(1.0)).Synchronize(lockObject) .SelectMany(i => lastMessageTime + Configuration.InitializationMessageTimeout < PlanningPoker.DateTimeProvider.UtcNow ? Observable.Throw <Action>(new TimeoutException()) : Observable.Empty <Action>()); void RetryRequestTeamList(Exception ex) { _logger?.LogWarning(Resources.Warning_RetryRequestTeamList, NodeId); RequestTeamList(); } initTeamActions.Merge(messageTimeoutActions) .Subscribe(a => a(), RetryRequestTeamList); var requestTeamsMessage = new NodeMessage(NodeMessageType.RequestTeams) { RecipientNodeId = recipientId, Data = _teamsToInitialize.Values.ToArray() }; SendNodeMessage(requestTeamsMessage); } }
private void ProcessInitializeTeamMessage(NodeMessage message) { var scrumTeamData = message.Data as byte[]; if (scrumTeamData != null) { var scrumTeam = ScrumTeamHelper.DeserializeScrumTeam(scrumTeamData, this.PlanningPoker.DateTimeProvider); this.teamsToInitialize.Remove(scrumTeam.Name); this.PlanningPoker.InitializeScrumTeam(scrumTeam); } else { // team does not exist anymore this.teamsToInitialize.Remove((string)message.Data); } if (this.teamsToInitialize.IsEmpty) { this.EndInitialization(); } }
private void OnScrumTeamCreated(NodeMessage message) { var scrumTeam = DeserializeScrumTeam((string)message.Data); _logger?.LogInformation(Resources.Info_ScrumTeamCreatedNodeMessageReceived, NodeId, message.SenderNodeId, message.RecipientNodeId, message.MessageType, scrumTeam.Name); if (!_teamsToInitialize.ContainsOrNotInit(scrumTeam.Name)) { try { _processingScrumTeamName = scrumTeam.Name; using (var teamLock = PlanningPoker.AttachScrumTeam(scrumTeam)) { } } finally { _processingScrumTeamName = null; } } }
private void ProcessInitializeTeamMessage(NodeMessage message) { var scrumTeamData = message.Data as byte[]; if (scrumTeamData != null) { var scrumTeam = ScrumTeamHelper.DeserializeScrumTeam(scrumTeamData, PlanningPoker.DateTimeProvider); _logger?.LogInformation(Resources.Info_ScrumTeamCreatedNodeMessageReceived, NodeId, message.SenderNodeId, message.RecipientNodeId, message.MessageType, scrumTeam.Name); _teamsToInitialize.Remove(scrumTeam.Name); PlanningPoker.InitializeScrumTeam(scrumTeam); } else { // team does not exist anymore _teamsToInitialize.Remove((string)message.Data); } if (_teamsToInitialize.IsEmpty) { EndInitialization(); } }
private void ProcessRequestTeamsMessage(NodeMessage message) { _logger?.LogInformation(Resources.Info_NodeMessageReceived, NodeId, message.SenderNodeId, message.RecipientNodeId, message.MessageType); var scrumTeamNames = (IEnumerable <string>)message.Data; foreach (var scrumTeamName in scrumTeamNames) { try { string scrumTeamData = null; try { using (var teamLock = PlanningPoker.GetScrumTeam(scrumTeamName)) { teamLock.Lock(); scrumTeamData = SerializeScrumTeam(teamLock.Team); } } catch (Exception) { scrumTeamData = null; } var initializeTeamMessage = new NodeMessage(NodeMessageType.InitializeTeam) { RecipientNodeId = message.SenderNodeId, Data = scrumTeamData != null ? scrumTeamData : (DeletedTeamPrefix + scrumTeamName) }; SendNodeMessage(initializeTeamMessage); } catch (Exception) { } } }
private void ProcessInitializeTeamMessage(NodeMessage message) { var scrumTeamData = (string)message.Data; if (scrumTeamData.StartsWith(DeletedTeamPrefix, StringComparison.Ordinal)) { // team does not exist anymore var teamName = scrumTeamData.Substring(DeletedTeamPrefix.Length); _teamsToInitialize.Remove(teamName); } else { var scrumTeam = DeserializeScrumTeam(scrumTeamData); _logger?.LogInformation(Resources.Info_ScrumTeamCreatedNodeMessageReceived, NodeId, message.SenderNodeId, message.RecipientNodeId, message.MessageType, scrumTeam.Name); _teamsToInitialize.Remove(scrumTeam.Name); PlanningPoker.InitializeScrumTeam(scrumTeam); } if (_teamsToInitialize.IsEmpty) { EndInitialization(); } }
private void ProcessTeamMessage(NodeMessage nodeMessage) { var message = (ScrumTeamMessage)nodeMessage.Data; _logger?.LogInformation(Resources.Info_ScrumTeamNodeMessageReceived, NodeId, nodeMessage.SenderNodeId, nodeMessage.RecipientNodeId, nodeMessage.MessageType, message.TeamName, message.MessageType); if (!_teamsToInitialize.ContainsOrNotInit(message.TeamName)) { switch (message.MessageType) { case MessageType.MemberJoined: OnMemberJoinedMessage(message.TeamName, (ScrumTeamMemberMessage)message); break; case MessageType.MemberDisconnected: OnMemberDisconnectedMessage(message.TeamName, (ScrumTeamMemberMessage)message); break; case MessageType.EstimationStarted: OnEstimationStartedMessage(message.TeamName); break; case MessageType.EstimationCanceled: OnEstimationCanceledMessage(message.TeamName); break; case MessageType.MemberEstimated: OnMemberEstimatedMessage(message.TeamName, (ScrumTeamMemberEstimationMessage)message); break; case MessageType.MemberActivity: OnMemberActivityMessage(message.TeamName, (ScrumTeamMemberMessage)message); break; } } }
private void SendNodeMessage(NodeMessage message) { message.SenderNodeId = this.NodeId; this.ServiceBus.SendMessage(message); }