/// <summary> /// Serializes a message to send to MDS server from Web Service. /// </summary> /// <param name="responseMessage">Message to serialize</param> /// <returns>Serialized message</returns> public static byte[] SerializeMessage(IWebServiceResponseMessage responseMessage) { CheckResponseMessage(responseMessage); var response = ((ResponseMessage)responseMessage).CreateDataTransferResponseMessage(); return(MDSSerializationHelper.SerializeToByteArray(response)); }
/// <summary> /// Gets waiting messages for an application. /// </summary> /// <param name="nextServer">Next server name</param> /// <param name="destApplication">Destination application name</param> /// <param name="minId">Minimum Id (as start Id)</param> /// <param name="maxCount">Max record count to get</param> /// <returns>Records gotten from database.</returns> public List <MDSMessageRecord> GetWaitingMessagesOfApplication(string nextServer, string destApplication, int minId, int maxCount) { var recordsTable = GetTable( "SELECT TOP " + maxCount + " * FROM Messages WHERE NextServer = @NextServer AND DestApplication = @DestApplication AND Id >= @Id ORDER BY Id ASC", new SqlParameter("@NextServer", nextServer), new SqlParameter("@DestApplication", destApplication), new SqlParameter("@Id", minId) ); var recordsList = new List <MDSMessageRecord>(recordsTable.Rows.Count); foreach (DataRow recordRow in recordsTable.Rows) { recordsList.Add( new MDSMessageRecord { Id = Convert.ToInt32(recordRow["Id"]), DestApplication = recordRow["DestApplication"] as string, DestServer = recordRow["DestServer"] as string, NextServer = recordRow["NextServer"] as string, Message = MDSSerializationHelper.DeserializeFromByteArray(() => new MDSDataTransferMessage(), (byte[])recordRow["MessageData"]), MessageId = recordRow["MessageId"] as string, RecordDate = (DateTime)recordRow["RecordDate"] }); } return(recordsList); }
/// <summary> /// Gets waiting messages for an MDS server. /// </summary> /// <param name="nextServer">Next server name</param> /// <param name="minId">Minimum Id (as start Id)</param> /// <param name="maxCount">Max record count to get</param> /// <returns>Records gotten from database.</returns> public List <MDSMessageRecord> GetWaitingMessagesOfServer(string nextServer, int minId, int maxCount) { DataTable recordsTable; lock (_syncObj) { recordsTable = GetTable( "SELECT * FROM messages WHERE NextServer = @NextServer AND Id >= @Id ORDER BY Id ASC Limit @LimitValue", new SQLiteParameter("@NextServer", nextServer), new SQLiteParameter("@Id", minId), new SQLiteParameter("@LimitValue", maxCount) ); } var recordsList = new List <MDSMessageRecord>(recordsTable.Rows.Count); foreach (DataRow recordRow in recordsTable.Rows) { recordsList.Add( new MDSMessageRecord { Id = Convert.ToInt32(recordRow["Id"]), DestApplication = recordRow["DestApplication"] as string, DestServer = recordRow["DestServer"] as string, NextServer = recordRow["NextServer"] as string, Message = MDSSerializationHelper.DeserializeFromByteArray(() => new MDSDataTransferMessage(), (byte[])recordRow["MessageData"]), MessageId = recordRow["MessageId"] as string, RecordDate = (DateTime)recordRow["RecordDate"] }); } return(recordsList); }
/// <summary> /// Deserializes a ControlMessage from a MDSControllerMessage. /// </summary> /// <param name="controllerMessage">MDSControllerMessage that includes ControlMessage</param> /// <returns>Deserialized ControlMessage object.</returns> private static ControlMessage DeserializeControlMessage(MDSControllerMessage controllerMessage) { return(MDSSerializationHelper.DeserializeFromByteArray( () => ControlMessageFactory.CreateMessageByTypeId(controllerMessage.ControllerMessageTypeId), controllerMessage.MessageData)); }
/// <summary> /// Sends a ControlMessage to MDS server. /// </summary> /// <param name="message">Message to send</param> public void SendMessage(ControlMessage message) { SendMessageInternal(new MDSControllerMessage { MessageData = MDSSerializationHelper.SerializeToByteArray(message), ControllerMessageTypeId = message.MessageTypeId }); }
/// <summary> /// Sends a message to a spesific communicator as a reply to an incoming message. /// </summary> /// <param name="communicator">Communicator to send message</param> /// <param name="message">Message to send</param> /// <param name="incomingMessage">Incoming message which is being replied</param> private void ReplyMessageToCommunicator(ICommunicator communicator, ControlMessage message, MDSControllerMessage incomingMessage) { //Create MDSControllerMessage that includes serialized GetApplicationListResponseMessage message var outgoingMessage = new MDSControllerMessage { ControllerMessageTypeId = message.MessageTypeId, MessageData = MDSSerializationHelper.SerializeToByteArray(message), RepliedMessageId = incomingMessage.MessageId }; //Send message to communicator that sent to message SendMessage(outgoingMessage, communicator); }
/// <summary> /// Saves a MDSMessageRecord. /// </summary> /// <param name="messageRecord">MDSMessageRecord object to save</param> /// <returns>Auto Increment Id of saved message</returns> public int StoreMessage(MDSMessageRecord messageRecord) { var bytesOfMessage = MDSSerializationHelper.SerializeToByteArray(messageRecord.Message); var id = InsertAndGetLastId( "INSERT INTO Messages(MessageId, DestServer, NextServer, DestApplication, MessageData, MessageDataLength, RecordDate) VALUES(@MessageId, @DestServer, @NextServer, @DestApplication, @MessageData, @MessageDataLength, GetDate())", new SqlParameter("@MessageId", messageRecord.MessageId), new SqlParameter("@DestServer", messageRecord.DestServer), new SqlParameter("@NextServer", messageRecord.NextServer), new SqlParameter("@DestApplication", messageRecord.DestApplication), new SqlParameter("@MessageData", bytesOfMessage), new SqlParameter("@MessageDataLength", bytesOfMessage.Length) ); messageRecord.Id = id; return(id); }
/// <summary> /// Sends a ControlMessage to MDS server and gets it's response message. /// </summary> /// <param name="message">Message to send</param> /// <returns>Response message from server</returns> public ControlMessage SendMessageAndGetResponse(ControlMessage message) { //Create a WaitingMessage to wait and get response message and add it to waiting messages var outgoingMessage = new MDSControllerMessage { MessageData = MDSSerializationHelper.SerializeToByteArray(message), ControllerMessageTypeId = message.MessageTypeId }; var waitingMessage = new WaitingMessage(); lock (_waitingMessages) { _waitingMessages[outgoingMessage.MessageId] = waitingMessage; } try { //Send message to the server SendMessageInternal(outgoingMessage); //Wait until thread is signalled by another thread to get response (Signalled by CommunicationChannel_MessageReceived method) waitingMessage.WaitEvent.WaitOne(TimeSpan.FromSeconds(90)); //Check if response received or timeout occured if (waitingMessage.ResponseMessage == null) { throw new MDSException("Timeout occured. Response message did not received."); } return(DeserializeControlMessage(waitingMessage.ResponseMessage)); } finally { //Remove message from waiting messages lock (_waitingMessages) { if (_waitingMessages.ContainsKey(outgoingMessage.MessageId)) { _waitingMessages.Remove(outgoingMessage.MessageId); } } } }
public int StoreMessage(MDSMessageRecord messageRecord) { int id = 0; var bytesOfMessage = MDSSerializationHelper.SerializeToByteArray(messageRecord.Message); //Buscando id e insertando while (true) { var collection = _database.GetCollection <MDSMessageRecord>(_tableName); int lastId = collection.AsQueryable() .OrderByDescending(m => m.Id) .Select(m => m.Id) .FirstOrDefault(); id = lastId + 1; messageRecord.Id = id; try { collection.InsertOne(messageRecord); } catch (Exception writeError) { if (writeError.Message.Contains("11000")) { continue; } else { throw writeError; } } break; } return(id); }
/// <summary> /// Handles MessageReceived event. /// All messages received from all controllers comes to this method. /// </summary> /// <param name="sender">Sender object</param> /// <param name="e">Event arguments</param> private void MDSController_MessageReceived(object sender, MessageReceivedFromRemoteApplicationEventArgs e) { try { //Response to Ping messages if ((e.Message.MessageTypeId == MDSMessageFactory.MessageTypeIdMDSPingMessage) && string.IsNullOrEmpty(e.Message.RepliedMessageId)) { //Reply ping message SendMessage(new MDSPingMessage { RepliedMessageId = e.Message.MessageId }, e.Communicator); return; } //Do not process messages other than MDSControllerMessage if (e.Message.MessageTypeId != MDSMessageFactory.MessageTypeIdMDSControllerMessage) { return; } //Cast message to MDSControllerMessage var controllerMessage = e.Message as MDSControllerMessage; if (controllerMessage == null) { return; } //Create (deserialize) ControlMessage from MessageData of controllerMessage object var controlMessage = MDSSerializationHelper.DeserializeFromByteArray( () => ControlMessageFactory.CreateMessageByTypeId(controllerMessage.ControllerMessageTypeId), controllerMessage.MessageData); //Process message ProcessControllerMessage(e.Communicator, controllerMessage, controlMessage); } catch (Exception ex) { Logger.Warn(ex.Message, ex); } }
/// <summary> /// Sends a ControlMessage to all connected MDSController instances. /// </summary> /// <param name="message">Message to send</param> private void SendMessageToAllReceivers(ControlMessage message) { var outgoingMessage = new MDSControllerMessage { ControllerMessageTypeId = message.MessageTypeId, MessageData = MDSSerializationHelper.SerializeToByteArray(message) }; var receivers = GetAllReceiverCommunicators(); foreach (var receiver in receivers) { try { SendMessage(outgoingMessage, receiver); } catch (Exception ex) { Logger.Warn(ex.Message, ex); } } }
/// <summary> /// Makes web service call, receives result and raises MessageReceived event. /// </summary> /// <param name="message"></param> private void SendMessageToWebService(MDSDataTransferMessage message) { using (var appService = new MDSAppService()) { appService.Url = _url; var responseMessageBytes = appService.ReceiveMDSMessage(MDSSerializationHelper.SerializeToByteArray(message)); if (responseMessageBytes == null) { throw new MDSException("Response byte array from web service call is null."); } var responseMessage = MDSSerializationHelper.DeserializeFromByteArray(() => new MDSDataTransferResponseMessage(), responseMessageBytes); if (responseMessage.Result != null) { OnMessageReceived(responseMessage.Result); } if (responseMessage.Message != null) { OnMessageReceived(responseMessage.Message); } } }
/// <summary> /// Deserializes an incoming message for Web Service from MDS server. /// </summary> /// <param name="bytesOfMessage">Message as byte array</param> /// <returns>Deserialized message</returns> public static IWebServiceIncomingMessage DeserializeMessage(byte[] bytesOfMessage) { var dataMessage = MDSSerializationHelper.DeserializeFromByteArray(() => new MDSDataTransferMessage(), bytesOfMessage); return(new IncomingDataMessage(dataMessage)); }