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); }
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(); }