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