예제 #1
0
        void StartSatellite(SatelliteContext ctx)
        {
            Logger.DebugFormat("Starting satellite {0} for {1}.", ctx.Instance.GetType().AssemblyQualifiedName,
                               ctx.Instance.InputAddress);

            try
            {
                if (ctx.Transport != null)
                {
                    ctx.Transport.TransportMessageReceived += (o, e) => HandleMessageReceived(o, e, ctx.Instance);
                    ctx.Transport.Start(ctx.Instance.InputAddress);
                }
                else
                {
                    Logger.DebugFormat("No input queue configured for {0}", ctx.Instance.GetType().AssemblyQualifiedName);
                }

                ctx.Instance.Start();
            }
            catch (Exception ex)
            {
                Logger.Error(
                    string.Format("Satellite {0} failed to start.", ctx.Instance.GetType().AssemblyQualifiedName), ex);

                if (ctx.Transport != null)
                {
                    ctx.Transport.ChangeMaximumConcurrencyLevel(0);
                }
            }
        }
예제 #2
0
        void StartSatellite(SatelliteContext context)
        {
            Logger.DebugFormat("Starting satellite {0} for {1}.", context.Instance.GetType().AssemblyQualifiedName,
                               context.Instance.InputAddress);

            try
            {
                if (context.Transport != null)
                {
                    context.Transport.TransportMessageReceived += (o, e) => HandleMessageReceived(o, e, context.Instance);
                    context.Transport.Start(context.Instance.InputAddress);
                }
                else
                {
                    Logger.DebugFormat("No input queue configured for {0}", context.Instance.GetType().AssemblyQualifiedName);
                }

                context.Instance.Start();
            }
            catch (Exception ex)
            {
                Logger.Fatal(string.Format("Satellite {0} failed to start.", context.Instance.GetType().AssemblyQualifiedName), ex);

                throw;
            }
        }
예제 #3
0
        protected virtual void StartSatellite(SatelliteContext ctx)
        {
            var thread = new Thread(Execute)
            {
                IsBackground = true
            };

            thread.Start(ctx);
        }
예제 #4
0
        public void Start()
        {
            var satellitesList = Configure.Instance.Builder
                                          .BuildAll<ISatellite>()
                                          .ToList()
                                          .Where(s => !s.Disabled)
                                          .ToList();

            var satelliteContexts = new SatelliteContext[satellitesList.Count];

            Parallel.For(0, satellitesList.Count, index =>
                {
                    var satellite = satellitesList[index];

                    Logger.DebugFormat("Starting {1}/{2} '{0}' satellite", satellite.GetType().AssemblyQualifiedName,
                                       index + 1, satellitesList.Count);

                    var ctx = new SatelliteContext
                        {
                            Instance = satellite
                        };

                    if (satellite.InputAddress != null)
                    {
                        ctx.Transport = Builder.Build<TransportReceiver>();

                        var advancedSatellite = satellite as IAdvancedSatellite;
                        if (advancedSatellite != null)
                        {
                            var receiverCustomization = advancedSatellite.GetReceiverCustomization();

                            receiverCustomization(ctx.Transport);
                        }
                    }

                    StartSatellite(ctx);

                    satelliteContexts[index] = ctx;

                    Logger.InfoFormat("Started {1}/{2} '{0}' satellite", satellite.GetType().AssemblyQualifiedName,
                                       index + 1, satellitesList.Count);

                });

            satellites.AddRange(satelliteContexts);
        }
예제 #5
0
        public void Start()
        {
            var satellitesList = Configure.Instance.Builder
                                 .BuildAll <ISatellite>()
                                 .ToList()
                                 .Where(s => !s.Disabled)
                                 .ToList();

            var satelliteContexts = new SatelliteContext[satellitesList.Count];

            Parallel.For(0, satellitesList.Count, index =>
            {
                var satellite = satellitesList[index];

                Logger.DebugFormat("Starting {1}/{2} '{0}' satellite", satellite.GetType().AssemblyQualifiedName,
                                   index + 1, satellitesList.Count);

                var ctx = new SatelliteContext
                {
                    Instance = satellite
                };

                if (satellite.InputAddress != null)
                {
                    ctx.Transport = Builder.Build <TransportReceiver>();

                    var advancedSatellite = satellite as IAdvancedSatellite;
                    if (advancedSatellite != null)
                    {
                        var receiverCustomization = advancedSatellite.GetReceiverCustomization();

                        receiverCustomization(ctx.Transport);
                    }
                }

                StartSatellite(ctx);

                satelliteContexts[index] = ctx;

                Logger.InfoFormat("Started {1}/{2} '{0}' satellite", satellite.GetType().AssemblyQualifiedName,
                                  index + 1, satellitesList.Count);
            });

            satellites.AddRange(satelliteContexts);
        }
예제 #6
0
        protected void Execute(object data)
        {
            SatelliteContext ctx = null;

            try
            {
                ctx = (SatelliteContext)data;
                if (ctx.Transport != null)
                {
                    ctx.Transport.TransportMessageReceived += (o, e) => HandleMessageReceived(o, e, ctx.Instance);
                    ctx.Transport.Start(ctx.Instance.InputAddress);

                    Logger.DebugFormat("Starting transport {0} for satellite {1} using {2} thread(s)", ctx.Instance.InputAddress, ctx.Instance.GetType().Name, ctx.Transport.NumberOfWorkerThreads);
                }
                else
                {
                    Logger.DebugFormat("No input queue configured for {0}", ctx.Instance.GetType().Name);
                }
                ctx.Instance.Start();
            }
            catch (Exception ex)
            {
                if (ctx != null)
                {
                    Logger.WarnFormat("Satellite {0} failed because of {1}", ctx.Instance.GetType().Name, ex.Message);

                    ctx.Started = false;

                    if (ctx.Transport != null)
                    {
                        ctx.Transport.ChangeNumberOfWorkerThreads(0);
                    }

                    ctx.FailedAttempts++;
                }
            }
        }
예제 #7
0
 protected override void StartSatellite(SatelliteContext ctx)
 {
     Execute(ctx);
 }
예제 #8
0
        void StartSatellite(SatelliteContext ctx)
        {
            Logger.DebugFormat("Starting satellite {0} for {1}.", ctx.Instance.GetType().AssemblyQualifiedName,
                               ctx.Instance.InputAddress);

            try
            {
                if (ctx.Transport != null)
                {
                    ctx.Transport.TransportMessageReceived += (o, e) => HandleMessageReceived(o, e, ctx.Instance);
                    ctx.Transport.Start(ctx.Instance.InputAddress);
                }
                else
                {
                    Logger.DebugFormat("No input queue configured for {0}", ctx.Instance.GetType().AssemblyQualifiedName);
                }

                ctx.Instance.Start();
            }
            catch (Exception ex)
            {
                Logger.Error(
                    string.Format("Satellite {0} failed to start.", ctx.Instance.GetType().AssemblyQualifiedName), ex);

                if (ctx.Transport != null)
                {
                    ctx.Transport.ChangeMaximumConcurrencyLevel(0);
                }
            }
        }
 public JobRequestsController(SatelliteContext context) => _context = context;
 public JobResponsesController(SatelliteContext context) => _context = context;
예제 #11
0
        void StartSatellite(SatelliteContext context)
        {
            Logger.DebugFormat("Starting satellite {0} for {1}.", context.Instance.GetType().AssemblyQualifiedName,
                               context.Instance.InputAddress);

            try
            {
                if (context.Transport != null)
                {
                    context.Transport.TransportMessageReceived += (o, e) => HandleMessageReceived(o, e, context.Instance);
                    context.Transport.Start(context.Instance.InputAddress);
                }
                else
                {
                    Logger.DebugFormat("No input queue configured for {0}", context.Instance.GetType().AssemblyQualifiedName);
                }

                context.Instance.Start();
            }
            catch (Exception ex)
            {
                Logger.Fatal(string.Format("Satellite {0} failed to start.", context.Instance.GetType().AssemblyQualifiedName), ex);

                throw;
            }
        }
 public SatellitesController(SatelliteContext context) => _context = context;