Esempio n. 1
0
        public void Reply()
        {
            var factory = new ConnectionFactory()
            {
                HostName = "localhost"
            };

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "rpc_queue", durable: false,
                                         exclusive: false, autoDelete: false, arguments: null);
                    channel.BasicQos(0, 1, false);
                    var consumer = new EventingBasicConsumer(channel);
                    channel.BasicConsume(queue: "rpc_queue",
                                         noAck: false, consumer: consumer);

                    consumer.Received += (model, ea) =>
                    {
                        var pitStopRequest = PitStopRequest.Deserialize(ea.Body);

                        Console.Write($"Stop request received: [{pitStopRequest.Message}] - ");
                        bool accept = this.random.Next(0, 10) > 5;
                        if (accept)
                        {
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.WriteLine("Accepted");
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("Rejected");
                        }
                        Console.ForegroundColor = ConsoleColor.Gray;


                        PitStopRequestReply response = new PitStopRequestReply()
                        {
                            IsAccepted = accept
                        };

                        var props      = ea.BasicProperties;
                        var replyProps = channel.CreateBasicProperties();
                        replyProps.CorrelationId = props.CorrelationId;

                        channel.BasicPublish(exchange: "", routingKey: props.ReplyTo,
                                             basicProperties: replyProps, body: PitStopRequestReply.Serialize(response));
                        channel.BasicAck(deliveryTag: ea.DeliveryTag,
                                         multiple: false);
                    };

                    this.isConsuming = true;
                    while (isConsuming)
                    {
                        Thread.Sleep(1);
                    }
                }
            }
        }
Esempio n. 2
0
        private static void RequestPitStop(CarParams carParams)
        {
            Console.WriteLine("Pit stop requested!");
            var pitStopRequester = new PitStopRequester();
            PitStopRequestReply pitStopRequestReply = pitStopRequester.Request(new PitStopRequest()
            {
                Message = $"Requesting PitStop from bolide! - {carParams}"
            });

            pitStopRequester.Stop();

            Console.WriteLine(pitStopRequestReply.IsAccepted ? "PitStop accepted!" : "PitStop denied!");
        }
        public PitStopRequestReply Request(PitStopRequest request)
        {
            var corrId = Guid.NewGuid().ToString();
            var props  = channel.CreateBasicProperties();

            props.ReplyTo       = replyQueueName;
            props.CorrelationId = corrId;

            channel.BasicPublish(exchange: "",
                                 routingKey: "rpc_queue",
                                 basicProperties: props,
                                 body: PitStopRequest.Serialize(request));

            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                if (ea.BasicProperties.CorrelationId == corrId)
                {
                    return(PitStopRequestReply.Deserialize(ea.Body));
                }
            }
        }