Example #1
0
        static void Main(string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var host = cfg.Host(new Uri("rabbitmq://192.168.17.129"), h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });
            });

            bus.Start();

            var message = new DemoRequest
            {
                Id      = 1,
                Content = "MassTransit.RequestResponse.Demo",
            };

            var address        = new Uri("rabbitmq://192.168.17.129/rabbitmq.demo.masstransit.requestresponse");
            var requestTimeout = TimeSpan.FromSeconds(30);
            var client         = new MessageRequestClient <DemoRequest, DemoResponse>(bus, address, requestTimeout);
            var result         = client.Request(message).GetAwaiter().GetResult();

            Console.WriteLine($"Response message: Code={result.ResultCode}, RequestId={result.RequestId}");

            bus.Stop();

            Console.WriteLine(" Press [enter] to exit request console.");
            Console.ReadLine();
        }
        private static async Task DoRequest(IBus bus)
        {
            var client = new MessageRequestClient <MyRequest, MyResponse>(
                bus,
                new Uri("rabbitmq://rmqcluster/qa/rmq-reconnection-test-app"),
                TimeSpan.FromSeconds(5),
                TimeSpan.FromSeconds(5));

            var id = Guid.NewGuid();

            Console.WriteLine($"Sending payload {id}");
            try
            {
                var response = await client.Request(new MyRequestImpl()
                {
                    Payload = id
                }).ConfigureAwait(false);

                Console.WriteLine($"Received response payload {response.Payload}");
            }
            catch (Exception e)
            {
                Console.WriteLine($"Exception thrown. Type: {e.GetType().Name} Message: {e.Message}");
            }
        }
Example #3
0
        /// <summary>
        /// Послать сообщение в очередь и получить сообщение в ответ
        /// </summary>
        /// <typeparam name="TRequest">тип запроса</typeparam>
        /// <typeparam name="TResponse">тип ответа</typeparam>
        /// <param name="request">запрос</param>
        /// <param name="requestTimeOutInSeconds">тайм-аут запроса в секундах</param>
        /// <param name="ignoreTimeoutException">Нужно ли игнорировать ошибку тайм аута. Если игнорируем, то возвращаем null</param>
        /// <returns>Task</returns>
        public async Task <TResponse> Request <TRequest, TResponse>(TRequest request, double requestTimeOutInSeconds, bool ignoreTimeoutException = false) where TRequest : class, IWithQueueName where TResponse : class
        {
            CheckForNull(request);

            var queueName = GetQueueNameOrThrow(request);

            InitBusAndThrowOnError();

            if (requestTimeOutInSeconds <= 0)
            {
                throw new Exception($"Таймаут для запроса должен быть больше нуля. Текущее значение = {requestTimeOutInSeconds}");
            }

            var address        = ComposeUri(queueName);
            var requestTimeout = TimeSpan.FromSeconds(requestTimeOutInSeconds);

            var client = new MessageRequestClient <TRequest, TResponse>(_bus, address, requestTimeout);

            try
            {
                return(await client.Request(request, CancellationToken.None));
            }
            catch (RequestTimeoutException e)
            {
                if (ignoreTimeoutException)
                {
                    return(null);
                }
                throw new Exception(e.Message);
            }
        }
Example #4
0
        public async Task Should_be_wicked_fast()
        {
            var bus = Bus.Factory.CreateUsingInMemory(cfg =>
            {
                cfg.UseBsonSerializer();

                cfg.ReceiveEndpoint("input-queue", e =>
                                    e.Handler <PingMessage>(async context =>
                {
                    await context.RespondAsync(new PongMessage(context.Message.CorrelationId));
                }));
            });

            await bus.StartAsync();

            try
            {
                var client = new MessageRequestClient <PingMessage, PongMessage>(bus, new Uri("loopback://localhost/input-queue"), TimeSpan.FromSeconds(30));

                int limit = 50000;
                int count = 0;

                await client.Request(new PingMessage());

                Stopwatch timer = Stopwatch.StartNew();

                await Task.WhenAll(Enumerable.Range(0, limit).Select(async x =>
                {
                    await client.Request(new PingMessage());

                    Interlocked.Increment(ref count);
                }));

                timer.Stop();

                Console.WriteLine("Time to process {0} messages = {1}", count, timer.ElapsedMilliseconds + "ms");
                Console.WriteLine("Messages per second: {0}", count * 1000 / timer.ElapsedMilliseconds);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
            finally
            {
                await bus.StopAsync();
            }
        }
Example #5
0
        /// <summary>
        ///     request to a service
        /// </summary>
        /// <param name="address"></param>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task <TResponse> Request(Uri address, TRequest request, CancellationToken cancellationToken)
        {
            var requestTimeout = TimeSpan.FromSeconds(300);

            var client = new MessageRequestClient <TRequest, TResponse>(_bus, address, requestTimeout);

            return(client.Request(request, cancellationToken));
        }
        public static TResponse Request <TRequest, TResponse>(string queueName, TRequest request)
            where TRequest : class
            where TResponse : class
        {
            var config = (IServiceConfig)ConfigurationManager.GetSection("service");
            IRequestClient <TRequest, TResponse> client = new MessageRequestClient <TRequest, TResponse>(Instance, new Uri(config.RabbitMq.GetQueueUrl(queueName)), TimeSpan.FromSeconds(30));

            return(client.Request(request).Result);
        }
        public async Task <TResponseMessage> SendRequest <TRequestMessage, TResponseMessage>(TRequestMessage requestMessage, string address) where TRequestMessage : class, IMessage where TResponseMessage : class, IMessage
        {
            var requestTimeout = TimeSpan.FromSeconds(30);
            var uri            = new Uri(address);
            var requestClient  = new MessageRequestClient <TRequestMessage, TResponseMessage>(_bus, uri,
                                                                                              requestTimeout);

            return(await requestClient.Request(requestMessage, new CancellationToken()));
        }
Example #8
0
        public async Task <JsonResult> Index(string prefix)
        {
            var address        = new Uri("rabbitmq://localhost/suggestions");
            var requestTimeout = TimeSpan.FromSeconds(30);

            IRequestClient <IGetSuggestions, IReturnSuggestions> client = new MessageRequestClient <IGetSuggestions, IReturnSuggestions>(MvcApplication.BusControl, address, requestTimeout);
            IReturnSuggestions result = await client.Request(new { Prefix = prefix });

            return(Json(result.Suggestions, JsonRequestBehavior.AllowGet));
        }
        private static void ExecuteSaga(IBusControl bus)
        {
            var address = new Uri($"loopback://localhost/req_resp_saga");

            var requestClient = new MessageRequestClient <IStartSaga, MyResponse>(bus, address, TimeSpan.FromSeconds(30));
            var response      = requestClient.Request(new { CorrelationId = Guid.NewGuid(), Data = "Please do this" })
                                .GetAwaiter()
                                .GetResult();

            Console.WriteLine($"This was the result: {response.ResponseMessage}");
        }
Example #10
0
        public async Task <IActionResult> Count()
        {
            var address        = new Uri("rabbitmq://localhost/WordCount.Service");
            var requestTimeout = TimeSpan.FromSeconds(30);

            var client = new MessageRequestClient <ICountRequest, ICountResponse>(_bus, address, requestTimeout);

            var response = await client.Request(new CountRequest(), CancellationToken.None).ConfigureAwait(false);

            return(Content($"<h1> Total: {response.Count} </h1>", "text/html", Encoding.UTF8));
        }
Example #11
0
        public static async Task <TResponse> SendCommandWithRespond <TRequest, TResponse>(TRequest request, CancellationToken cancellationToken = default(CancellationToken))
            where TRequest : class
            where TResponse : class
        {
            var address        = new Uri("rabbitmq://localhost/commands");
            var requestTimeout = TimeSpan.FromSeconds(30);

            IRequestClient <TRequest, TResponse> client =
                new MessageRequestClient <TRequest, TResponse>(Startup.Bus, address, requestTimeout);

            return(await client.Request(request, cancellationToken));
        }
        public async Task <IUserDataResponse> Get(int id)
        {
            var address = new Uri("rabbitmq://localhost/UserData");

            var client   = new MessageRequestClient <IUserDataRequest, IUserDataResponse>(_bus, address, TimeSpan.FromSeconds(30));
            var response = await client.Request(new { Id = id });

            //var addUserEndpoint = await _bus.GetSendEndpoint(new Uri("rabbitmq://localhost/UserData"));

            //await addUserEndpoint.Send<IUserDataRequest>(new {Id = 1});
            return(response);
        }
        /// <summary>
        /// Method to run the test case
        /// </summary>
        /// <param name="busControl">
        /// The bus for the test case to use
        /// </param>
        public override async Task Run(BusControl busControl)
        {
            var hostUri = busControl.Instance.Address;

            var address        = new Uri($"{hostUri.Scheme}://{hostUri.Host}/{QueueName}");
            var requestTimeout = TimeSpan.FromSeconds(30);

            var requestClient =
                new MessageRequestClient <IRequestMessage, IResponseMessage>(busControl.Instance, address, requestTimeout);

            await SendMessages(message =>
                               requestClient.Request(message).ConfigureAwait(false)
                               );
        }
Example #14
0
 public DocumentsResponse?Request(DocumentInfo input)
 {
     try
     {
         var address        = new Uri("rabbitmq://localhost/" + input.Type + "Request");
         var requestTimeout = TimeSpan.FromSeconds(10);
         IRequestClient <Document, DocumentsResponse> requestClient =
             new MessageRequestClient <Document, DocumentsResponse>(bus, address, requestTimeout);
         return(requestClient.Request(input).Result);
     }
     catch (Exception)
     {
         return(null);
     }
 }
Example #15
0
        public async Task Test()
        {
            try
            {
                var serviceAddress = new Uri($"rabbitmq://localhost/{MvcApplication.QueueName}");
                var requestClient  = new MessageRequestClient <ITest, ITestResponse>(MvcApplication.Bus, serviceAddress, TimeSpan.FromSeconds(10));
                var response       = await requestClient.Request(new Test { Message = $"Test Request {DateTime.Now}" });

                await Clients.All.TestResponse($"{DateTime.Now} - Got response: {response.Response}");
            }
            catch (Exception ex)
            {
                await Clients.All.TestResponse($"{DateTime.Now} - Got exception:\n{ex.ToString()}");
            }
        }
Example #16
0
        public async Task Request()
        {
            var bus = Bus.Factory.CreateUsingHttp(cfg =>
            {
                var mainHost = cfg.Host(new Uri("http://localhost:8080"));
                //TODO: serializer?

                cfg.ReceiveEndpoint(ep =>
                {
                    ep.Consumer <HttpEater>();
                });
            });

            var mc = new MessageRequestClient <Ping, Pong>(bus, new Uri("http://requestb.in/15alnbk1"), TimeSpan.FromMinutes(500));

            await mc.Request(new Ping(), default(CancellationToken));
        }
Example #17
0
            public async Task Should_work_with_the_message_request_client_too()
            {
                _hostAddress = new Uri("http://localhost:8080");

                var busControl = Bus.Factory.CreateUsingHttp(cfg =>
                {
                    var mainHost = cfg.Host(_hostAddress, h =>
                    {
                        h.Method = HttpMethod.Post;
                    });

                    cfg.ReceiveEndpoint(mainHost, "", ep =>
                    {
                        ep.Consumer <HttpRequestConsumer>();
                    });
                });

                await busControl.StartAsync(TestCancellationToken);

                try
                {
                    IRequestClient <Request, Response> client = new MessageRequestClient <Request, Response>(busControl, _hostAddress, TimeSpan.FromSeconds(30));

                    var request = new Request {
                        Value = "Hello"
                    };


                    for (var i = 0; i < 5; i++)
                    {
                        var timer = Stopwatch.StartNew();


                        var result = await client.Request(request);

                        timer.Stop();

                        await Console.Out.WriteLineAsync($"Request complete: {timer.ElapsedMilliseconds}ms, Response = {result.ResponseValue}");
                    }
                }
                finally
                {
                    await busControl.StopAsync().WithTimeout(TimeSpan.FromSeconds(30));
                }
            }
        private void Authenticate(string userNameKey, string passwordKey)
        {
            var serviceConfig = (IServiceConfig)ConfigurationManager.GetSection("service");
            var userName      = ConfigurationManager.AppSettings[userNameKey];
            var password      = ConfigurationManager.AppSettings[passwordKey];

            var url = new Uri(serviceConfig.RabbitMq.GetQueueUrl(WellKnownQueues.AccessControl));
            IRequestClient <IAuthenticateUser, IAuthenticateUserResult> request = new MessageRequestClient <IAuthenticateUser, IAuthenticateUserResult>(Bus.Instance, url, TimeSpan.FromSeconds(30));
            var result = request.Request(new AuthenticateUser(userName, password)).Result;

            if (!result.Authenticated)
            {
                throw new SecurityException($"Invalid credentials specified. Please check these settings {userNameKey} and {passwordKey} in the app.config file.");
            }

            // take care of automatical request authentication
            Bus.Instance.ConnectTicket(result.Ticket);
        }
Example #19
0
        private static async Task Work()
        {
            await _bus.StartAsync();

            var requestClient = new MessageRequestClient <HelloWorld, HelloResponse>(
                _bus,
                new Uri("rabbitmq://10.211.55.10/prognet/test"),
                TimeSpan.FromMinutes(10));

            await Task.WhenAll(Enumerable.Range(0, 1000).Select(
                                   async x =>
            {
                var response = await requestClient.Request(
                    new HelloWorld {
                    Text = "Hi there"
                },
                    CancellationToken.None);

                Console.WriteLine(response.AmendedText);
            }).ToArray());
        }
Example #20
0
        public async Task <ActionResult <string> > Get(int id)
        {
            Log.Info("WebApi Service: Get Values: {0}", id);
            var request = new GetValuesRequestMessage
            {
                Index = id
            };

            try
            {
                var endpoint = new Uri($"rabbitmq://localhost/{Constants.ServiceQueue}");
                var client   = new MessageRequestClient <GetValuesRequestMessage, GetValuesResponseMessage>(_busHost.Bus, endpoint, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15));
                var response = await client.Request(request);

                return(response?.Message);
            }
            catch (Exception e)
            {
                Log.Error(e, "Error getting value");
                return(e.Message);
            }
        }
Example #21
0
        public void TestRequestResponse()
        {
            var address    = "rabbitmq://localhost/";
            var addressUri = new Uri(address);
            var queue      = "UnitTests_MessageRequestResponse";

            _busControl = MassTransit.Bus.Factory.CreateUsingRabbitMq(x =>
            {
                var host = x.Host(addressUri, h => { });
                x.ReceiveEndpoint(host, queue, e =>
                                  e.Consumer(() => new PingCommandResponder()));
            });

            _busControl.Start();
            var requestTimeout = TimeSpan.FromSeconds(10);
            var queueUri       = new Uri(address + queue);
            IRequestClient <IPingRequest, IPingResponse> client =
                new MessageRequestClient <IPingRequest, IPingResponse>(_busControl, queueUri, requestTimeout);
            var response = client.Request(new PingRequest {
                BoingsCount = 0
            }).Result;

            Assert.AreEqual(response.BoingsCount, 1);
        }
Example #22
0
        public async Task Should_get_the_response_to_the_bus()
        {
            IRequestClient <PingMessage, PongMessage> client = new MessageRequestClient <PingMessage, PongMessage>(Bus, InputQueueAddress, TestTimeout);

            await client.Request(new PingMessage(), TestCancellationToken);
        }
Example #23
0
        public static void Start()
        {
            // load the Log4Net config from app.config
            XmlConfigurator.Configure();

            var busControl = ConfigureBus();

            busControl.Start();
            do
            {
                Console.WriteLine("'q' to exit");
                Console.WriteLine("'1' -> Request / response");
                Console.WriteLine("'666' -> Request / exception");
                Console.Write("> ");
                var value = Console.ReadLine();

                if ("q".Equals(value, StringComparison.OrdinalIgnoreCase))
                {
                    break;
                }

                switch (value)
                {
                case "1":
                case "666":
                    Console.Out.WriteLine(
                        $"{DateTime.Now:O} Requesting status of OrderId {value}");

                    /*
                     * create the request client
                     * Creates the response queue bus-WINBOOK-MassTransit.Sandbox.RequestResponse-yyyyyyb8yyfyyx1zbdk5jec9r5
                     * with autodelete = true and expiration = 60000 ms
                     */
                    var client =
                        new MessageRequestClient <CheckOrderStatus, OrderStatusResult>(busControl, new Uri("rabbitmq://localhost/check_order_queue"), TimeSpan.FromSeconds(30));
                    try
                    {
                        // send the message expecting the response in the Task Result
                        var result = client.
                                     Request(new CheckOrderStatus {
                            OrderId = value
                        }).Result;
                        Console.Out.WriteLine(
                            $"{DateTime.Now:O} Received status {result.StatusText} ({result.StatusCode}) for OrderId {result.OrderId}");

                        /*
                         * The payload received in the response queue is
                         *
                         * {
                         *
                         *    "messageId": "00000000-2700-0a00-8b04-08d5b4a2ef65",
                         *
                         *    "requestId": "00000000-2700-0a00-e326-08d5b4a2ef63",
                         *
                         *    "conversationId": "00000000-2700-0a00-3635-08d5b4a2ef64",
                         *
                         *    "sourceAddress": "rabbitmq://localhost/check_order_queue",
                         *
                         *    "destinationAddress": "rabbitmq://localhost/bus-WINBOOK-MassTransit.Sandbox.RequestResponse-yyyyyyb8yyfyy7r9bdk5jewgdd?durable=false&autodelete=true",
                         *
                         *    "messageType": [
                         *
                         *      "urn:message:MassTransit.Sandbox.RequestResponse.Contracts:OrderStatusResult"
                         *
                         *    ],
                         *
                         *    "message": {
                         *
                         *      "orderId": "1",
                         *
                         *      "timestamp": "2018-05-08T07:17:03.6952914+02:00",
                         *
                         *      "statusCode": 1,
                         *
                         *      "statusText": "Sent"
                         *
                         *    },
                         *
                         *    "sentTime": "2018-05-08T05:17:03.6952914Z",
                         *
                         *    "headers": {},
                         *
                         *    "host": {
                         *
                         *      "machineName": "WINBOOK",
                         *
                         *      "processName": "MassTransit.Sandbox.RequestResponse",
                         *
                         *      "processId": 13764,
                         *
                         *      "assembly": "MassTransit.Sandbox.RequestResponse",
                         *
                         *      "assemblyVersion": "1.0.0.0",
                         *
                         *      "frameworkVersion": "4.0.30319.42000",
                         *
                         *      "massTransitVersion": "5.0.0.1475",
                         *
                         *      "operatingSystemVersion": "Microsoft Windows NT 6.2.9200.0"
                         *
                         *    }
                         *
                         *  }
                         */
                    }
                    catch (System.AggregateException e)
                    {
                        /*
                         * The payload received in the response queue is
                         *  {
                         *
                         *    "messageId": "00000000-2700-0a00-476f-08d5b4a2f145",
                         *
                         *    "requestId": "00000000-2700-0a00-836c-08d5b4a2f141",
                         *
                         *    "conversationId": "00000000-2700-0a00-c2b4-08d5b4a2f141",
                         *
                         *    "sourceAddress": "rabbitmq://localhost/check_order_queue",
                         *
                         *    "destinationAddress": "rabbitmq://localhost/bus-WINBOOK-MassTransit.Sandbox.RequestResponse-yyyyyyb8yyfyy7r9bdk5jewgdd?durable=false&autodelete=true",
                         *
                         *    "messageType": [
                         *
                         *      "urn:message:MassTransit:Fault[[MassTransit.Sandbox.RequestResponse.Contracts:CheckOrderStatus]]",
                         *
                         *      "urn:message:MassTransit:Fault"
                         *
                         *    ],
                         *
                         *    "message": {
                         *
                         *      "faultId": "00000000-2700-0a00-3d20-08d5b4a2f145",
                         *
                         *      "faultedMessageId": "00000000-2700-0a00-8b89-08d5b4a2f141",
                         *
                         *      "timestamp": "2018-05-08T05:17:06.8458671Z",
                         *
                         *      "exceptions": [
                         *
                         *        {
                         *
                         *          "exceptionType": "System.InvalidOperationException",
                         *
                         *          "stackTrace": "   à MassTransit.Sandbox.RequestResponse.Consumers.CheckOrderStatusConsumer.<Consume>d__0.MoveNext() dans C:\\Users\\Eric\\Documents\\Work\\Github\\MassTransit.Sandbox\\MassTransit.Sandbox\\RequestResponse\\Consumers\\CheckOrderStatusConsumer.cs:ligne 15\r\n--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---\r\n   à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   à MassTransit.Pipeline.ConsumerFactories.DefaultConstructorConsumerFactory`1.<Send>d__0`1.MoveNext()\r\n--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---\r\n   à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   à MassTransit.Pipeline.Filters.ConsumerMessageFilter`2.<GreenPipes-IFilter<MassTransit-ConsumeContext<TMessage>>-Send>d__4.MoveNext()",
                         *
                         *          "message": "Order not found",
                         *
                         *          "source": "MassTransit.Sandbox"
                         *
                         *        }
                         *
                         *      ],
                         *
                         *      "host": {
                         *
                         *        "machineName": "WINBOOK",
                         *
                         *        "processName": "MassTransit.Sandbox.RequestResponse",
                         *
                         *        "processId": 13764,
                         *
                         *        "assembly": "MassTransit.Sandbox.RequestResponse",
                         *
                         *        "assemblyVersion": "1.0.0.0",
                         *
                         *        "frameworkVersion": "4.0.30319.42000",
                         *
                         *        "massTransitVersion": "5.0.0.1475",
                         *
                         *        "operatingSystemVersion": "Microsoft Windows NT 6.2.9200.0"
                         *
                         *      },
                         *
                         *      "message": {
                         *
                         *        "orderId": "666"
                         *
                         *      }
                         *
                         *    },
                         *
                         *    "sentTime": "2018-05-08T05:17:06.8458671Z",
                         *
                         *    "headers": {},
                         *
                         *    "host": {
                         *
                         *      "machineName": "WINBOOK",
                         *
                         *      "processName": "MassTransit.Sandbox.RequestResponse",
                         *
                         *      "processId": 13764,
                         *
                         *      "assembly": "MassTransit.Sandbox.RequestResponse",
                         *
                         *      "assemblyVersion": "1.0.0.0",
                         *
                         *      "frameworkVersion": "4.0.30319.42000",
                         *
                         *      "massTransitVersion": "5.0.0.1475",
                         *
                         *      "operatingSystemVersion": "Microsoft Windows NT 6.2.9200.0"
                         *
                         *    }
                         *
                         *  }
                         */
                        var exception = e.InnerException as RequestFaultException;
                        if (exception != null)
                        {
                            // we've got an exception rasied by the consumer !
                            Console.WriteLine($"{DateTime.Now:O} {exception.Fault.Exceptions[0].Message}");
                        }
                        else
                        {
                            // re-throw any unexpected exceptions
                            throw;
                        }
                    }

                    break;
                }
            } while (true);
            busControl.Stop();
        }
        public async Task Should_get_the_response_to_the_bus()
        {
            IRequestClient<PingMessage,PongMessage> client = new MessageRequestClient<PingMessage, PongMessage>(Bus, InputQueueAddress, TestTimeout);

            await client.Request(new PingMessage(), TestCancellationToken);
        }