Esempio n. 1
0
        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();
            }
        }
Esempio n. 3
0
        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;
                }
            }
        }
Esempio n. 4
0
        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();
            }
        }
Esempio n. 5
0
        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)
                {
                }
            }
        }
Esempio n. 6
0
        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();
            }
        }
Esempio n. 7
0
        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);
 }