static async Task RunCommands(JObject json, TriggerList tl) { try { ParamHelper.ValidateParamsExist(json, "cmd", "usr"); } catch (ArgumentException ex) { Console.Error.WriteLine($"Error in Queue JSON: {ex.Message}"); return; } string command = json["cmd"].ToString().ToUpper(); string user = json["usr"].ToString(); JObject commandParams = (JObject)json["params"]; string stock = commandParams["stock"].ToString(); Console.WriteLine(command); await Task.Run(() => { if (command.Equals("BUY") || command.Equals("SELL")) { var tid = json["tid"]?.ToString(); var queue = json["queue"]?.ToString(); var price = (decimal)commandParams["price"]; tl.Add(stock, command, user, price, tid, queue); } else if (command.Equals("CANCEL_BUY") || command.Equals("CANCEL_SELL")) { tl.Remove(stock, command, user); } }); }
static async Task Main(string[] args) { var quitSignalled = new TaskCompletionSource <bool>(); Console.CancelKeyPress += new ConsoleCancelEventHandler((sender, eventArgs) => { quitSignalled.SetResult(true); eventArgs.Cancel = true; // Prevent program from quitting right away }); TriggerList tl = new TriggerList(); RabbitHelper.CreateConsumer(RunCommands, tl); Console.WriteLine("Twig running..."); Console.WriteLine("Press Ctrl-C to exit."); while (true) { var completed = await Task.WhenAny(quitSignalled.Task, Task.Delay(20000)); Console.WriteLine("Polling"); if (completed == quitSignalled.Task) { break; } var tasks = tl.Keys.Select(async sym => { if (tl[sym].ContainsKey("BUY")) { Trigger t = tl[sym]["BUY"].Max; if (t != null) { tl.CheckBuy(sym, await QuoteHelper.GetQuote(t.User, sym, t.Tid)); } } if (tl[sym].ContainsKey("SELL")) { Trigger t = tl[sym]["SELL"].Min; if (t != null) { tl.CheckSell(sym, await QuoteHelper.GetQuote(t.User, sym, t.Tid)); } } return; }); await Task.WhenAll(tasks); } Console.WriteLine("Quitting..."); Console.WriteLine("Done."); Environment.Exit(0); }
public static void CreateConsumer(Func <JObject, TriggerList, Task> messageCallback, TriggerList tl) { var consumer = new AsyncEventingBasicConsumer(rabbitChannel); consumer.Received += async(model, eventArgs) => { JObject message = null; try { message = JObject.Parse(Encoding.UTF8.GetString(eventArgs.Body)); } catch (JsonReaderException ex) { Console.Error.WriteLine($"Unable to parse Queue message into JSON: {ex.Message}"); } if (message != null) { await messageCallback(message, tl); } // We will always ack even if we can't parse it otherwise queue will hang rabbitChannel.BasicAck(eventArgs.DeliveryTag, false); }; // This will begin consuming messages asynchronously rabbitChannel.BasicConsume( queue: rabbitTriggerPendingQueue, autoAck: false, consumer: consumer ); }