Exemplo n.º 1
0
        public async Task<string[]> GetFieldsByMachines(IList<string> machines)
        {
            if (machines.Count > 0)
            {
                var machinesJson = JsonConvert.SerializeObject(machines);
                Utils.Query q = new Utils.Query { Type = "GetFieldsByMachines", Field = machinesJson };
                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;
                if (String.IsNullOrEmpty(result))
                {
                    return null;
                }
                else
                {
                    var fields = JsonConvert.DeserializeObject<List<String>>(result).ToArray();
                    return fields;
                }
            }
            else
            {
                return null;
            }
        }
Exemplo n.º 2
0
        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}");
            }
        }
Exemplo n.º 3
0
        public async Task SendMessageAsync(string address, AMQPMessage body, DateTimeOffset?whenToRun = null)
        {
            if (!_senderLinks.ContainsKey(address))
            {
                throw new Exception($"Address {address} is not available for AMQP sending");
            }

            await _senderLinks[address].SendMessageAsync(body, whenToRun).ConfigureAwait(false);
        }
        public async Task SendMessageAsync(string address, AMQPMessage body, double?timeOffsetSeconds = null)
        {
            if (!_queueClientHosts.ContainsKey(address))
            {
                throw new Exception($"Address {address} is not available for AMQP sending");
            }

            await _queueClientHosts[address].SendMessageAsync(body, timeOffsetSeconds).ConfigureAwait(false);
        }
Exemplo n.º 5
0
        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 async Task SendMessageTrySynchronousFirstAsync(string address, AMQPMessage body, double?timeOffsetSeconds = null)
        {
            try
            {
                await ProcessMessageAsync(address, JsonConvert.SerializeObject(body)).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                if (!_cancellationToken.IsCancellationRequested)
                {
                    Console.WriteLine($"AMQP exception in sender link for address {address}: {e}");

                    await SendMessageAsync(address, body, timeOffsetSeconds).ConfigureAwait(false);
                }
            }
        }
Exemplo n.º 7
0
        /// <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());
            }
        }
Exemplo n.º 8
0
        public async Task SendMessageAsync(AMQPMessage messageBody, double?timeOffsetSeconds = null)
        {
            // whenToRun is not supported with RabbitMQ!

            SenderLink senderLink;
            bool       error;

            do
            {
                senderLink = _senderLink;
                error      = false;

                if (CancellationToken.IsCancellationRequested)
                {
                    throw new Exception("AMQP cancellation is requested, can not send message");
                }

                try
                {
                    if (senderLink == null || senderLink.IsClosed)
                    {
                        await InitializeAsync().ConfigureAwait(false);
                    }

                    global::Amqp.Message message = new global::Amqp.Message(JsonConvert.SerializeObject(messageBody))
                    {
                        Header = new global::Amqp.Framing.Header()
                        {
                            Durable = true
                        }
                    };

                    await senderLink.SendAsync(message, TimeSpan.FromSeconds(10)).ConfigureAwait(false);
                }
                catch (AmqpException e)
                {
                    error = true;

                    await semaphore.WaitAsync().ConfigureAwait(false);

                    try
                    {
                        if (senderLink == _senderLink)
                        {
                            // nobody else handled this before

                            if (!CancellationToken.IsCancellationRequested)
                            {
                                _logger.LogError($"AMQP exception in sender link for address {Address}: {e}");
                            }

                            await CloseAsync().ConfigureAwait(false);
                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                    finally
                    {
                        semaphore.Release();
                    }

                    if (!CancellationToken.IsCancellationRequested)
                    {
                        await Task.Delay(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
                    }
                }
            } while (error);
        }
Exemplo n.º 9
0
        /// <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());
            }
        }
Exemplo n.º 10
0
        public async Task SendMessageAsync(AMQPMessage messageBody, double?timeOffsetSeconds = null)
        {
            QueueClient queueClient;
            bool        error;

            do
            {
                queueClient = _queueClient;
                error       = false;

                if (CancellationToken.IsCancellationRequested)
                {
                    throw new Exception("AMQP cancellation is requested, can not send message");
                }

                try
                {
                    if (queueClient == null || queueClient.IsClosedOrClosing)
                    {
                        await InitializeAsync().ConfigureAwait(false);
                    }

                    var message = new Microsoft.Azure.ServiceBus.Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(messageBody)))
                    {
                        ContentType = "application/json",
                        MessageId   = Guid.NewGuid().ToString()
                    };

                    if (timeOffsetSeconds == null)
                    {
                        await queueClient.SendAsync(message).ConfigureAwait(false);
                    }
                    else
                    {
                        await queueClient.ScheduleMessageAsync(message, DateTimeOffset.UtcNow.AddSeconds((double)timeOffsetSeconds)).ConfigureAwait(false);
                    }
                }
                catch (Exception e)
                {
                    error = true;

                    await semaphore.WaitAsync().ConfigureAwait(false);

                    try {
                        if (queueClient == _queueClient)
                        {
                            // nobody else handled this before

                            if (!CancellationToken.IsCancellationRequested)
                            {
                                Console.WriteLine($"AMQP exception in sender link for address {Address}: {e}");
                            }

                            await CloseAsync().ConfigureAwait(false);
                        }
                    }
                    catch (Exception e2)
                    {
                        throw e2;
                    }
                    finally
                    {
                        semaphore.Release();
                    }

                    if (!CancellationToken.IsCancellationRequested)
                    {
                        await Task.Delay(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
                    }
                }
            } while (error);
        }