예제 #1
0
        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);
                }
            });
        }
예제 #2
0
        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);
        }
예제 #3
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
                );
        }