public static async Task <String> DoWork(IModel channel, BasicDeliverEventArgs basicDeliveryEventArgs, bool cancelled, CancellationTokenSource cancellationTokenSource = default)
        {
            PiTask response = new PiTask();

            try
            {
                response = JsonConvert.DeserializeObject <PiTask>(Encoding.UTF8.GetString(basicDeliveryEventArgs.Body));
                Console.WriteLine("[Received] " + response.name);
                if (cancelled)
                {
                    response.result = "-1";
                }
                else
                {
                    response.result = await CalculatePiPrecision(response.precision, cancellationTokenSource.Token);
                }
            }
            catch (TaskCanceledException e)
            {
                response.result = "-1";
            }
            catch (OperationCanceledException e)
            {
                response.result = "-1";
            }
            finally
            {
                IBasicProperties replyBasicProperties = channel.CreateBasicProperties();
                replyBasicProperties.CorrelationId = basicDeliveryEventArgs.BasicProperties.CorrelationId;
                byte[] responseBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(response));
                channel.BasicPublish("", basicDeliveryEventArgs.BasicProperties.ReplyTo, replyBasicProperties, responseBytes);
                channel.BasicAck(basicDeliveryEventArgs.DeliveryTag, false);
            }
            return(basicDeliveryEventArgs.BasicProperties.CorrelationId);
        }
Exemple #2
0
        static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                         .WriteTo.Console()
                         .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
                         .CreateLogger();
            try
            {
                Log.Information("Bootstrapping wiring");

                Pi.Init <BootstrapWiringPi>();
                _pumpRelay = new RelayDriver(Pi.Gpio[BcmPin.Gpio00], "Pump", OnStatusChanged);
                var twoMinutes = MillisecondsPerMinute * 2;

                var tasks = new PiTask[]
                {
                    new DoubleRelayTask("Solenoid 3", relayA: _pumpRelay, pinB: Pi.Gpio[BcmPin.Gpio02],
                                        assetId: "Solenoid_1", recurrence: MillisecondsPerDay / 2, onTimeInMs: twoMinutes,
                                        onStatusChanged: OnStatusChanged),
                    new DoubleRelayTask("Solenoid 1", relayA: _pumpRelay, pinB: Pi.Gpio[BcmPin.Gpio03],
                                        assetId: "Solenoid_2", recurrence: MillisecondsPerDay / 2, onTimeInMs: twoMinutes,
                                        onStatusChanged: OnStatusChanged),
                    new DoubleRelayTask("Solenoid 2", relayA: _pumpRelay, pinB: Pi.Gpio[BcmPin.Gpio21],
                                        assetId: "Solenoid_3", recurrence: MillisecondsPerDay / 2, onTimeInMs: twoMinutes,
                                        onStatusChanged: OnStatusChanged),
                    new DoubleRelayTask("Solenoid 4", relayA: _pumpRelay, pinB: Pi.Gpio[BcmPin.Gpio22],
                                        assetId: "Solenoid_4", recurrence: MillisecondsPerDay / 2, onTimeInMs: twoMinutes,
                                        onStatusChanged: OnStatusChanged),
                    new EnvironmentTask("DHT11", pin: Pi.Gpio[BcmPin.Gpio25], recurrence: twoMinutes,
                                        sendIoTMessage: Program.SendIoTMessage)
                };
                Log.Information("Scheduling Tasks", tasks);

                var scheduler = new Scheduler(tasks, granularityInMilliseconds: MillisecondsPerMinute / 12);
                scheduler.Run();
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Fatal Error");
                throw;
            }
        }
        static void Main(string[] args)
        {
            RabbitMQService rabbitMQService = new RabbitMQService();
            IConnection     connection      = rabbitMQService.GetRabbitMqConnection();
            IModel          channel         = connection.CreateModel();

            channel.QueueDeclare(rabbitMQService.queueName, false, false, false, null);
            string responseQueue = channel.QueueDeclare().QueueName;

            EventingBasicConsumer basicResponseConsumer = new EventingBasicConsumer(channel);

            basicResponseConsumer.Received += (sender, basicDeliveryEventArgs) =>
            {
                IBasicProperties props    = basicDeliveryEventArgs.BasicProperties;
                PiTask           response = new PiTask();
                if (props != null)
                {
                    response = JsonConvert.DeserializeObject <PiTask>(Encoding.UTF8.GetString(basicDeliveryEventArgs.Body));
                }
                channel.BasicAck(basicDeliveryEventArgs.DeliveryTag, false);
                Console.WriteLine("[Received] " + "Task No. " + response.id + " Precision: " + response.precision + " Result: " + response.result);
            };
            channel.BasicConsume(responseQueue, false, basicResponseConsumer);

            string[] tasks = new string[100];
            Random   rnd   = new Random();

            for (int i = 0; i < 100; i++)
            {
                PiTask message = new PiTask()
                {
                    id = i, name = "Calculate Pi Precision Task No. " + i.ToString(), precision = rnd.Next(1, maxPrecision)
                };
                string correlationId = Guid.NewGuid().ToString();
                tasks[i] = correlationId;
                IBasicProperties basicProperties = channel.CreateBasicProperties();
                basicProperties.ReplyTo       = responseQueue;
                basicProperties.CorrelationId = correlationId;
                byte[] messageBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));
                channel.BasicPublish("", rabbitMQService.queueName, basicProperties, messageBytes);
                Console.WriteLine("[Sent] " + "Task No. " + message.id + " Precision: " + message.precision);
            }

            channel.QueueDeclare(rabbitMQService.stopQueueName, false, false, false, null);
            IBasicProperties basicPropertiess = channel.CreateBasicProperties();
            bool             running          = true;

            Console.WriteLine("Write \"exit\" to stop program");
            Console.WriteLine("Write \"stop\" to stop all tasks");
            Console.WriteLine("Write \"stop\" [id] to stop task with directed ID");
            string command;
            int    result;
            bool   parse;

            string[] splitString;
            while (running)
            {
                command = Console.ReadLine().ToLower();
                if (command == "exit")
                {
                    running = false;
                }
                else if (command == "stop")
                {
                    channel.BasicPublish("", rabbitMQService.stopQueueName, basicPropertiess, Encoding.UTF8.GetBytes("stop"));
                }
                else
                {
                    splitString = command.Split(' ');
                    if (splitString.Length > 1)
                    {
                        parse = Int32.TryParse(splitString[1], out result);
                        if (parse && result < 100)
                        {
                            channel.BasicPublish("", rabbitMQService.stopQueueName, basicPropertiess, Encoding.UTF8.GetBytes("stop " + tasks[result]));
                        }
                    }
                }
            }
            Console.ReadKey();

            channel.Close();
            connection.Close();
        }