Ejemplo n.º 1
0
        private void _spreadConnection_OnMembershipMessage(SpreadMessage msg)
        {
            MembershipInfo info  = msg.MembershipInfo;
            SpreadGroup    group = info.Group;

            if (info.IsRegularMembership)
            {
                SpreadGroup[] members = info.Members;
                Console.WriteLine($"Regular membership for {group.ToString()} with {members.Length} members:");
                for (int i = 0; i < members.Length; i++)
                {
                    Console.WriteLine($"\t {members[i]}");
                }

                Console.WriteLine($"GroupID: {info.GroupID}");
            }

            SpreadGroup Sender;

            if (info.IsCausedByDisconnect)
            {
                Sender = info.Disconnected;
                Console.WriteLine($"{Sender} has disconnected ...");
                isDisconnected = true;
                _delegate      = new InformClientOfChange(NotifyClient);
                _delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port);
            }
            if (info.IsCausedByLeave)
            {
                Sender = info.Left;
                Console.WriteLine($"{Sender} has left ...");
                isDisconnected = true;
                _delegate      = new InformClientOfChange(NotifyClient);
                _delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port);
            }
            if (info.IsCausedByJoin)
            {
                Sender = info.Joined;
                Console.WriteLine($"{Sender} has joined ...");

                if (isInitState)
                {
                    #region Set Primary
                    Console.WriteLine("Setting Primary Server ...");

                    int highestPort = _configurationManager.ServerGroups.ToList().Max();

                    if (ServerOptions.Port.Equals(highestPort))
                    {
                        ServerOptions.IsPrimary = true;
                        Console.WriteLine("I am the primary server ...");
                    }
                    else
                    {
                        ServerOptions.IsPrimary = false;
                        Console.WriteLine("I am the backup server ...");
                    }
                    #endregion
                }
                else
                {
                    //receive full state
                }

                //_delegate = new InformClientOfChange(NotifyClient);
                //_delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port);
            }
        }
Ejemplo n.º 2
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            Console.WriteLine($"Server running at: {DateTimeOffset.Now}");

            #region comments
            //while (true)
            //{
            //    if (ServerOptions.IsPrimary)
            //    {
            //        //init heartbeat

            //        //start receiving data from the clients
            //        //store data in text file

            //        //send SpreadMessage to the group
            //        while (true)
            //        {
            //            Console.WriteLine("Sending data");
            //            //var data = new { Id = 1, address = "akka.net.address", name = "uniqueName" };
            //            var data = $"test";

            //            //byte[] dataForSpreadMessage = Encoding.ASCII.GetBytes($"{data.Id}|{data.address}|{data.name}");
            //            _spreadService.SendSpreadMessage(data);
            //            Thread.Sleep(2000);
            //        }



            //        //await and ACK
            //        _spreadService._spreadConnection.OnRegularMessage += _spreadConnection_OnRegularMessage;
            //        _spreadService._spreadConnection.OnMembershipMessage += _spreadConnection_OnMembershipMessage;

            //        //reply to client

            //        await Task.Delay(1000, stoppingToken);
            //    }
            //    else
            //    {
            //        //init hearbeat
            //        Console.WriteLine("Listening for messages...");

            //        if(_spreadService._spreadConnection.Poll())
            //        {
            //            var msg = _spreadService.ReceiveSpreadMessage();

            //            if (msg.MembershipInfo.IsCausedByLeave || msg.MembershipInfo.IsCausedByDisconnect)
            //            {
            //                ServerOptions.IsPrimary = true;
            //                NotifyChangeToClients();
            //            }
            //            else
            //            {
            //                if (_spreadService._spreadConnection.Poll())
            //                {
            //                    //update local storage

            //                    //send ack
            //                    _spreadService.SendACK();
            //                }
            //            }
            //        }
            //        else
            //        {
            //            await Task.Delay(2000, stoppingToken);
            //            continue;
            //        }
            //    }
            //}
            #endregion

            if (isDisconnected)
            {
                _delegate = new InformClientOfChange(NotifyClient);
                _delegate = NotifyClient;
            }

            await Task.Delay(2000, stoppingToken);
        }