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