Beispiel #1
0
        public DataFlowOpInitializeResult Initialize(DataFlowOpInitializateContext initContext)
        {
            var dataflowContext = initContext.DataflowInstanceUserObject as DataflowContext;
            var log = dataflowContext.Resolve<ILogger>();

            var port = ChoosePort(Port, new[] { 80, 8080 });

            if(port.HasValue == false)
            {
                log.Error("Unable to bind to port {Port}", Port);
            }

            var tcpListener = new TcpListener(IPAddress.Any, port.Value);
            tcpListener.Start(100);

            log.Information("Port open {Endpoint}", tcpListener.LocalEndpoint.ToString());

            Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    var tcpClient = await tcpListener.AcceptTcpClientAsync();
                    var stream = tcpClient.GetStream();

                    var context = new HttpContext()
                    {
                        Connection = tcpClient,
                        Request = new HttpRequest(stream),
                        Response = new HttpResponse(stream)
                    };
                    await context.Request.ReadHeadersAsync();

                    log = log.ForContext(new[] {
                        new CorrelationEnricher(context.Correlation.ToString())
                        });
                    context.Properties.Add("Log", log);

                    log.Information("Request Accepted {Correlation}", context.Correlation);
                    log.Verbose("{@Block} {@Request}", this, context.Request);

                    Emitter.Submit(context);
                }
            });

            var httpContext = initContext.ServicesContext.EventAdapterService.GetEventTypeByName("HttpContext");
            return new DataFlowOpInitializeResult(new[] { new com.espertech.esper.dataflow.util.GraphTypeDesc(false, false, httpContext) });
        }
Beispiel #2
0
        //private async Task<ServiceDto> CallConsul(HttpContext context, ILogger log, string serviceName)
        //{
        //    try
        //    {
        //        var data = new ServiceDto();
        //        log.Verbose("Searching service in Consul...");

        //        using (var client = new ConsulClient())
        //        {
        //            var consulCatalog = await client.Catalog.Service(serviceName);

        //            if (consulCatalog.Response.Length > 0)
        //            {
        //                var service = consulCatalog.Response[0];
        //                data.Address = IPAddress.Parse(service.Address);
        //                data.Port = service.ServicePort;

        //                log.Information("Sending request to {Host}:{port}...", service.Address, data.Port);
        //            }
        //            else
        //            {
        //                log.Warning("Service not found!");
        //                context.Response.Send(404);
        //            }
        //        }

        //        return data;
        //    }
        //    catch (Exception e)
        //    {
        //        log.Error(e, "Cannot call Consul");
        //        context.Response.Send(500);
        //        return null;
        //    }
        //}

        private static async Task CallService(HttpContext context, HttpRequest request, ILogger log, ServiceInfo serviceInfo)
        {
            IPAddress serviceAdress = IPAddress.Parse(serviceInfo.Address);
            int servicePort = serviceInfo.Port;

            using (context)
            {
                try
                {
                    using (var client = new TcpClient())
                    {
                        client.Connect(serviceAdress, servicePort);

                        using (var realService = client.GetStream())
                        {
                            log.Verbose("Sending request...");

                            await request.RedirectToAsync(realService);

                            log.Verbose("Waiting response...");

                            await context.Response.RedirectFromAsync(realService);

                            log.Information("Finished!");
                        }
                    }
                }
                catch (Exception e)
                {
                    log.Error(e, "Cannot call service");
                    context.Response.Send(500);
                }
            }
        }