static async Task RunConsumer(RequestResponseFactory factory) { // get number of consumers to run var consumerCount = GetNumberInActionArgs(0); var consumers = new Task[consumerCount]; for (int i = 0; i < consumerCount; i++) { consumers[i] = Task.Run(() => { var responder = factory.GetResponder <GetLoanOptionsRequestPayload, GetLoanOptionsResponsePayload>(request => { return(new GetLoanOptionsResponsePayload { Provider = "BRINKLE", LoanAmount = request.CreditScore * 4 }); }); responder.RequestReceived += m => logger.WriteOutput($"Incoming: SessionId = {m.ReplyToSessionId}"); responder.ResponseSending += m => logger.WriteOutput($"Outgoing: SessionId = {m.SessionId}"); responder.ExceptionOccurred += args => logger.WriteOutput($"Fatal: {args.Exception.GetType().Name} {args.Exception.Message}"); return(responder.RespondToRequests()); }); } logger.WriteOutput("Listening on the queue..."); await Task.WhenAll(consumers); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); var connectionString = Configuration["ServiceBusConnectionString"]; factory = new RequestResponseFactory(connectionString, "thequeue", "theotherqueue"); factory.EnsureEntitiesExist().GetAwaiter().GetResult(); services.AddSingleton(factory); services.AddLogging(builder => { builder.AddConsole(); }); }
static void Main(string[] args) { Console.WriteLine("Service Bus Test Tool"); Console.WriteLine("============================="); if (!Config.ParseArgs(args, Console.Out)) { return; } logger = new ConsoleLogger(Console.Out); logger.Start(); Console.CancelKeyPress += Console_CancelKeyPress; try { var factory = new RequestResponseFactory(Config.ConnectionString, Config.QueueSendName, Config.QueueRespondName); factory.EnsureEntitiesExist().GetAwaiter().GetResult(); if (Config.SendRequest) { TimeOperation(() => SendRequests(factory)).GetAwaiter().GetResult(); } else if (Config.SendResponse) { RunConsumer(factory).GetAwaiter().GetResult(); } else { throw new Exception("Fatal: Unrecognized action initiated"); } } catch (Exception ex) { var origColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(ex.Message); Console.ForegroundColor = origColor; } }
static async Task SendRequests(RequestResponseFactory factory) { // get number of requests to make var requestsToSend = GetNumberInActionArgs(0); var msDelayBetweenReqs = GetNumberInActionArgs(1); var httpEndpoint = GetActionArg(2); if (httpEndpoint != null) { SetupHttpClient(httpEndpoint); } var sender = factory.GetSender <GetLoanOptionsRequestPayload, GetLoanOptionsResponsePayload>(); sender.RequestSending += (r, m) => { logger.WriteOutput($"{r.Id:000} REQUEST: CreditScore = {r.CreditScore}, SessionId = {m.ReplyToSessionId}"); }; var random = new Random(); var outstandingRequests = new Task[requestsToSend]; logger.WriteOutput("Sending requests..."); for (var i = 0; i < requestsToSend; i++) { var payload = new GetLoanOptionsRequestPayload { Id = i, CreditScore = random.Next(300, 801) }; var rememberI = i; if (httpEndpoint == null) { outstandingRequests[i] = sender.SendRequest(payload).ContinueWith(async t => { if (t.IsFaulted) { foreach (var e in t.Exception.InnerExceptions) { logger.WriteOutput($"{rememberI:000} Failure: {e.Message}"); } return; } var response = await t; logger.WriteOutput($"{rememberI:000} RESPONSE: Provider = {response.Provider}, Loan = {response.LoanAmount}"); }); } else { outstandingRequests[i] = SendHttpRequest(payload).ContinueWith(async t => { var response = await t; logger.WriteOutput($"{rememberI:000} RESPONSE: Provider = {response.Provider}, Loan = {response.LoanAmount}"); }); } await Task.Delay(msDelayBetweenReqs); } await Task.WhenAll(outstandingRequests); logger.Stop(); if (httpEndpoint == null) { OutputAppMessage($"Average Round Trip Time (sec): {Math.Round(sender.AverageRTTms / 1000.0, 3)}"); OutputAppMessage($"Min Round Trip Time (sec): {Math.Round(sender.MinRTTms / 1000.0, 3)}"); OutputAppMessage($"Max Round Trip Time (sec): {Math.Round(sender.MaxRTTms / 1000.0, 3)}"); } else { OutputAppMessage($"Average Round Trip Time (sec): {Math.Round(SendOverHttp_AverageRTTms / 1000.0, 3)}"); OutputAppMessage($"Min Round Trip Time (sec): {Math.Round(SendOverHttp_MinRTTms / 1000.0, 3)}"); OutputAppMessage($"Max Round Trip Time (sec): {Math.Round(SendOverHttp_MaxRTTms / 1000.0, 3)}"); } }
public ValuesController(RequestResponseFactory factory) { this.factory = factory; }