public void AddBankReply(BankReply bankReply) { messageCount++; if (messageCount == expectedMessages) { bankReplies.Add(bankReply); var bestRate = bankReplies.Aggregate((i1, i2) => i1.interestRate < i2.interestRate ? i1 : i2); Console.WriteLine("Best rate: {0} with bank: {1}", bestRate.interestRate, bestRate.bankName); messageRouter.SendToRecipientList(bestRate); } else { bankReplies.Add(bankReply); } }
public void SendToRecipientList(BankReply bankReply) { using (var connection = _factory.CreateConnection()) using (var channel = connection.CreateModel()) { string routingKey = "laurbaer_soap_response"; string jsonRecip = JsonConvert.SerializeObject(bankReply, Formatting.Indented); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine("[{0}] >> Sending to {1}", DateTime.Now.ToString("HH:mm:ss"), routingKey); channel.ExchangeDeclare(exchange: Constants.DirectExchangeName, type: Constants.DirectExhangeType); var body = Encoding.UTF8.GetBytes(jsonRecip); channel.BasicPublish(exchange: Constants.DirectExchangeName, routingKey: routingKey, basicProperties: null, body: body); } }
public void CreateSecondConsumer() { var connection = _factory.CreateConnection(); var channel = connection.CreateModel(); channel.ExchangeDeclare(exchange: Constants.DirectExchangeName, type: Constants.DirectExhangeType); Dictionary <string, object> args = new Dictionary <string, object>(); args.Add("x-dead-letter-exchange", "dead_exchange"); var queueName = channel.QueueDeclare("", false, false, false, args).QueueName; Console.WriteLine(queueName); channel.QueueBind(queue: queueName, exchange: Constants.DirectExchangeName, routingKey: "laurbaer_aggr"); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var probs = ea.BasicProperties; var message = Encoding.UTF8.GetString(body); Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine("[{0}] << received on {1}", DateTime.Now.ToString("HH:mm:ss"), message); BankReply loanRequest = null; try { loanRequest = JsonConvert.DeserializeObject <BankReply>(message); } catch (JsonException ex) { Dictionary <string, Object> err = new Dictionary <string, Object>(); err.Add("test", ex.Message); Console.WriteLine(ex.Message); Console.WriteLine("Sending to Dead letter chan."); ea.Body = Encoding.ASCII.GetBytes(ex.Message); channel.BasicNack(ea.DeliveryTag, false, false); //Todo: Send to dead letter return; } //If no correlationId found.. Dead letter channel or whatevr. also handle timeout BankQuoteAggregate bankQuoteAggregate = null; if (aggregators.TryGetValue(probs.CorrelationId, out bankQuoteAggregate)) { channel.BasicAck(ea.DeliveryTag, false); bankQuoteAggregate.AddBankReply(loanRequest); } else { //channel.BasicAck(ea.DeliveryTag, false); //channel.BasicReject(ea.DeliveryTag, false); channel.BasicNack(ea.DeliveryTag, false, false); } // Err channel here. }; channel.BasicConsume(queue: queueName, noAck: false, consumer: consumer); }