public async Task<string[]> GetMachines() { //invio richiesta query a microservizio database Utils.Query q = new Utils.Query { Type = "GetMachines" }; var message = new AMQPMessage { Type = AMQPMessageType.Query, Data = JsonConvert.SerializeObject(q), Sender = "management" }; await _amqpconn.SendMessageAsync("direct_message", "database", JsonConvert.SerializeObject(message)); //ricezione query result string result = await taskCompletionSource.Task; var machines = JsonConvert.DeserializeObject<List<String>>(result).ToArray(); return machines; }
public static async void GetTelemetryFromDB(string machineId, int period, string field) { try { var query = new Query(); query.MachineId = machineId; query.Period = period; query.Field = field; var data = JsonConvert.SerializeObject(query); var request = new AMQPMessage(); request.Sender = _config.Communications.AMQP.Queue; request.Data = data; request.Type = AMQPMessageType.Query; var json = JsonConvert.SerializeObject(request); //Inizializzo nuovo canale dedicato e riservato al thread corrente var channel = _amqpconn.CreateChannel(); //Scrivo messaggio query sul canale appena creato await _amqpconn.SendMessageAsync(_config.Communications.AMQP.Exchange, "database", json, channel); //Chiudo canale _amqpconn.CloseChannel(channel); } catch (Exception e) { log.Error($"Error: {e.Message}"); } }
/// <summary> /// Metodo invocato ogni qual volta viene ricevuto un messaggio MQTT /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static async void OnMQTTMessageReceived(object sender, string e) { try { //Pubblicazione messaggio ricevuto su broker AMQP var message = new AMQPMessage { Data = e, Type = AMQPMessageType.Telemetry, Sender = _config.Communications.AMQP.Queue }; var json = JsonConvert.SerializeObject(message); await _amqpconn.SendMessageAsync(_config.Communications.AMQP.Exchange, "common", json); } catch (Exception ex) { _log.ErrorFormat("!ERROR: {0}", ex.ToString()); } }
/// <summary> /// Metodo invocato ogni qual volta viene ricevuto un messaggio AMQP /// </summary> /// <param name="sender"></param> /// <param name="msg"></param> public async static void OnAMQPMessageReceived(object sender, String msg) { try { var message = JsonConvert.DeserializeObject <AMQPMessage>(msg); switch (message.Type) { //Ricezione telemetrie istantanee da broker AMQP case AMQPMessageType.Telemetry: //scrittura su database InfluxDB await _dbconnection.WriteData(message.Data); break; //Ricezione richiesta di query da parte del microservizio DATABASE case AMQPMessageType.Query: var query = JsonConvert.DeserializeObject <Query>(message.Data); int period = query.Period; var machineId = query.MachineId; var req_sender = message.Sender; var field = query.Field; var type = query.Type; var result = ""; switch (type) { case "GetMachines": result = await _dbconnection.GetMachines(); break; case "GetFieldsByMachines": var machines = JsonConvert.DeserializeObject <List <String> >(field); result = await _dbconnection.GetFieldsByMachine(machines); break; default: result = await _dbconnection.ReadData(machineId, field, period); break; } var body = new AMQPMessage { Type = AMQPMessageType.QueryResult, Data = result, Sender = _config.Communications.AMQP.Queue }; var json = JsonConvert.SerializeObject(body); //invio risposta await _amqpconn.SendMessageAsync(_config.Communications.AMQP.Exchange, req_sender, json); break; } Console.WriteLine("{0} - {1}: ", message.Type.ToString(), message.Data); } catch (Exception e) { log.ErrorFormat("!ERROR: {0}", e.ToString()); } }