/// <summary> /// This method is just used to make a new connection with NGRID server. /// It receives response of register message and adds communicator to Communicators if successfuly registered. /// </summary> /// <param name="sender">Creator object of event</param> /// <param name="e">Event arguments</param> private void Communicator_MessageReceived(object sender, MessageReceivedFromCommunicatorEventArgs e) { try { //Message must be NGRIDOperationResultMessage var message = e.Message as NGRIDOperationResultMessage; if (message == null) { throw new NGRIDException("First message must be NGRIDOperationResultMessage"); } //Check if remote NGRID server accepted connection if(!message.Success) { throw new NGRIDException("Remote NGRID server did not accept connection."); } //Unregister from event and add communicator to Communicators list. e.Communicator.MessageReceived -= Communicator_MessageReceived; try { AddCommunicator(e.Communicator); } catch (Exception ex) { Logger.Warn(ex.Message, ex); e.Communicator.Stop(false); } } catch (Exception ex) { Logger.Warn("Can not connected to remote NGRID server: '" + Name + "'. Connection is being closed."); Logger.Warn(ex.Message, ex); try { e.Communicator.Stop(false); } catch (Exception ex2) { Logger.Warn(ex2.Message, ex2); } } finally { _reconnectingCommunicator = null; } }
/// <summary> /// When a message received from a communicator, this method is called. /// This method just process Register messages. After a register message received /// from cummunicator, stops listen to events from this communicator anymore. /// </summary> /// <param name="sender">Sender (ICommunicator)</param> /// <param name="e">Event args</param> private void Communicator_MessageReceived(object sender, MessageReceivedFromCommunicatorEventArgs e) { if (e.Message.MessageTypeId != NGRIDMessageFactory.MessageTypeIdNGRIDRegisterMessage) { return; } try { ProcessRegisterMessage(e.Communicator, e.Message as NGRIDRegisterMessage); } catch (Exception ex) { Logger.Warn(ex.Message, ex); } finally { e.Communicator.MessageReceived -= Communicator_MessageReceived; } }
/// <summary> /// This method is used to get NGRIDOperationResultMessage objects (ACK/Reject messages) by MessageDeliverer class. /// It is called by NGRIDRemoteApplication's Communicator_MessageReceived method. /// </summary> /// <param name="e">Event arguments from Communicator_MessageReceived method</param> /// <returns>True, if message is handled by this method</returns> public bool HandleOperationResultMessage(MessageReceivedFromCommunicatorEventArgs e) { lock (_remoteApplication._communicators) { var connectedCommunicator = _remoteApplication.FindCommunicator(e.Communicator); if (connectedCommunicator != null && connectedCommunicator.ProcessingMessage != null && connectedCommunicator.ProcessingMessage.MessageId == e.Message.RepliedMessageId) { //Set communicator as free connectedCommunicator.ProcessingMessage = null; //Send receiver to end of the list _remoteApplication._communicators.Remove(connectedCommunicator); _remoteApplication._communicators.AddLast(connectedCommunicator); //Suspend communicator if it rejected the message var resultMessage = e.Message as NGRIDOperationResultMessage; if (resultMessage != null && !resultMessage.Success) { connectedCommunicator.IsSuspended = true; connectedCommunicator.SuspendExpireDate = DateTime.Now.AddSeconds(15); } else { //Pulse threads that are waiting for a free communicator Monitor.PulseAll(_remoteApplication._communicators); } return true; } } return false; }
/// <summary> /// Raises a MessageReceived event. /// </summary> /// <param name="sender">Creator of event</param> /// <param name="e">Event arguments</param> protected void OnMessageReceived(object sender, MessageReceivedFromCommunicatorEventArgs e) { try { if (MessageReceived != null) { MessageReceived(sender, new MessageReceivedFromRemoteApplicationEventArgs { Application = this, Communicator = e.Communicator, Message = e.Message }); } else { //Disconnect communicator if there is not listener for incoming messages from this communicator. e.Communicator.Stop(false); } } catch (Exception ex) { Logger.Warn(ex.Message, ex); } }
/// <summary> /// Processes a NGRIDChangeCommunicationWayMessage message. /// </summary> /// <param name="e">Event arguments from Communicator_MessageReceived method</param> private static void ProcessChangeCommunicationWayMessage(MessageReceivedFromCommunicatorEventArgs e) { var message = e.Message as NGRIDChangeCommunicationWayMessage; if (message == null) { return; } //Change communication way e.Communicator.CommunicationWay = message.NewCommunicationWay; }
/// <summary> /// Processes a NGRIDOperationResultMessage message. /// </summary> /// <param name="e">Event arguments from Communicator_MessageReceived method</param> private void ProcessOperationResultMessage(MessageReceivedFromCommunicatorEventArgs e) { //Send message to message deliverer to process var handled = _messageDeliverer.HandleOperationResultMessage(e); /* If message is handled, OnResponseReceived event is raised, * thus, caller of SendDataMessage (NGRIDPersistentRemoteApplicationBase.ProcessWaitingMessage) method * gets response. */ if (handled) { OnResponseReceived(e.Communicator, e.Message as NGRIDOperationResultMessage); } }
/// <summary> /// When a communicator is received a message, this method handles event.. /// </summary> /// <param name="sender">Creator of event</param> /// <param name="e">Event arguments</param> private void Communicator_MessageReceived(object sender, MessageReceivedFromCommunicatorEventArgs e) { //Update last incoming message time LastIncomingMessageTime = DateTime.Now; //Check if this is an ACK/Reject message for a data transfer message if ((e.Message.MessageTypeId == NGRIDMessageFactory.MessageTypeIdNGRIDOperationResultMessage) && (!string.IsNullOrEmpty(e.Message.RepliedMessageId))) { ProcessOperationResultMessage(e); return; } //Check if this is an NGRIDChangeCommunicationWayMessage if (e.Message.MessageTypeId == NGRIDMessageFactory.MessageTypeIdNGRIDChangeCommunicationWayMessage) { ProcessChangeCommunicationWayMessage(e); return; } //Add message to incoming message queue to process as ordered _incomingMessageQueue.Add(e); }