Ejemplo n.º 1
0
        static async Task Main(string[] args)
        {
            var rabbitBus = RabbitHutch.CreateBus(RabbitConfig, _ => { });

            var logger = new LoggerConfiguration()
                         .WriteTo.Console()
                         .CreateLogger();

            var bus = new BusModel(rabbitBus.Advanced);
            var rpc = new RpcModel(rabbitBus.Advanced);

            var logic = new BusinessLogic(bus, rpc, logger);

            await rpc.RegisterHandlerAsync("toxon.micro.router.register", async (requestMessage, _) =>
            {
                var request = JsonMessage.Read <RegisterRouteRequest>(requestMessage);

                var response = await logic.RegisterRoute(request);

                return(JsonMessage.Write(new RegisterRouteResponse {
                    Done = response
                }));
            });

            await bus.RegisterHandlerAsync("toxon.micro.router.route", (message, _) => logic.RouteBusMessage(message));

            await rpc.RegisterHandlerAsync("toxon.micro.router.route", (message, _) => logic.RouteRpcMessage(message));

            logic.Start();

            Console.WriteLine("Running Router... press enter to exit!");
            Console.ReadLine();
        }
        private async Task <bool> CheckHealth(string serviceKey, string healthEndpoint)
        {
            var nonce = Interlocked.Increment(ref _nonce);

            var request = new HealthCheck {
                Health = "ping", Nonce = nonce
            };
            var requestMessage = JsonMessage.Write(request);

            var cts = new CancellationTokenSource();

            cts.CancelAfter(_healthCheckTimeout);

            try
            {
                var responseMessage = await _rpc.SendAsync(healthEndpoint, requestMessage, cts.Token);

                var response = JsonMessage.Read <HealthCheck>(responseMessage);

                return(response.Health == "pong" && response.Nonce == nonce);
            }
            catch (TaskCanceledException)
            {
                return(false);
            }
        }
Ejemplo n.º 3
0
        public IReadOnlyCollection <Entry> Match(Message message)
        {
            var fields = JsonMessage.Read <Dictionary <string, object> >(message);

            fields = new Dictionary <string, object>(fields, StringComparer.InvariantCultureIgnoreCase);

            return(_routeSelectionStrategy.Select(_routes.Values.ToList(), fields));
        }
        protected async Task <Message> JsonRpcHandler <TRequest, TResponse>(Message requestMessage, Func <TRequest, Task <TResponse> > handler)
        {
            var request = JsonMessage.Read <TRequest>(requestMessage);

            var response = await handler(request);

            var responseMessage = JsonMessage.Write(response);

            return(responseMessage);
        }
Ejemplo n.º 5
0
        public async Task SendAsync(Message message, CancellationToken cancellationToken = default)
        {
            var routes = _busRouter.Match(message);

            if (!routes.Any())
            {
                var fields = JsonMessage.Read <Dictionary <string, object> >(message);

                _logger.Information("Failed to match any routes for bus message: {fields}", fields);
            }

            foreach (var route in routes)
            {
                await route.Data.Handler(message, cancellationToken);
            }
        }
        private static Task <Message> HandleHealthCheckAsync(Message requestMessage, CancellationToken cancellationToken)
        {
            var request = JsonMessage.Read <HealthCheck>(requestMessage);

            var response = "unknown";

            if (request.Health == "ping")
            {
                response = "pong";
            }

            return(Task.FromResult(JsonMessage.Write(new HealthCheck
            {
                Health = response,
                Nonce = request.Nonce,
            })));
        }
Ejemplo n.º 7
0
        public Task <Message> CallAsync(Message message, CancellationToken cancellationToken = default)
        {
            var routes = _rpcRouter.Match(message);

            if (!routes.Any())
            {
                var fields = JsonMessage.Read <Dictionary <string, object> >(message);

                _logger.Error("Failed to match any routes for RPC message: {fields}", fields);

                var fieldsString = string.Join(", ", fields.Select(x => $"{x.Key}:{x.Value}"));
                throw new Exception($"Failed to match any routes for RPC message: {fieldsString}");
            }

            var route = routes.Single();

            return(route.Data.Handler(message, cancellationToken));
        }
        protected async Task JsonBusHandler <TRequest>(Message requestMessage, Func <TRequest, Task> handler)
        {
            var request = JsonMessage.Read <TRequest>(requestMessage);

            await handler(request);
        }