コード例 #1
0
        private static EnhancedServiceParams BuildBaseParams(string connectionString, int poolSize,
                                                             PoolParams poolParams       = null, ConnectionParams connectionParams = null,
                                                             CachingParams cachingParams = null)
        {
            var parameters =
                new EnhancedServiceParams
            {
                ConnectionParams = connectionParams ?? new ConnectionParams {
                    ConnectionString = connectionString
                },
                PoolParams = poolParams ?? new PoolParams {
                    PoolSize = poolSize
                }
            };

            if (cachingParams != null)
            {
                parameters.IsCachingEnabled = true;
                parameters.CachingParams    = cachingParams;
            }

            if (AutoSetMaxPerformanceParams)
            {
                parameters.AutoSetMaxPerformanceParams();
            }

            return(parameters);
        }
コード例 #2
0
        public static EnhancedServicePool <AsyncOrgService> GetAsyncPool(string connectionString, int poolSize = 10,
                                                                         EnhancedServiceParams serviceParams   = null, bool isHoldAppForAsync = true)
        {
            var builder = EnhancedServiceBuilder.NewBuilder.Initialise(connectionString);

            if (serviceParams?.IsCachingEnabled == true)
            {
                builder.AddCaching(serviceParams.CachingParams);
            }

            if (serviceParams?.IsConcurrencyEnabled != false)
            {
                builder.AddConcurrency(serviceParams?.ConcurrencyParams);

                if (isHoldAppForAsync)
                {
                    builder.HoldAppForAsync();
                }
            }

            if (serviceParams?.IsTransactionsEnabled == true)
            {
                builder.AddTransactions(serviceParams.TransactionParams);
            }

            var build   = builder.Finalise().GetBuild();
            var factory = new EnhancedServiceFactory <AsyncOrgService>(build);

            return(new EnhancedServicePool <AsyncOrgService>(factory, poolSize));
        }
コード例 #3
0
        public static EnhancedServicePool <Services.EnhancedOrgService> GetPool(string connectionString,
                                                                                EnhancedServiceParams serviceParams = null)
        {
            var builder = EnhancedServiceBuilder.NewBuilder.Initialise(connectionString);

            if (serviceParams?.IsCachingEnabled == true)
            {
                serviceParams.CachingParams = serviceParams.CachingParams
                                              ?? new CachingParams
                {
                    CacheMode = CacheMode.PrivatePerInstance
                };
                builder.AddCaching(serviceParams.CachingParams);
            }

            if (serviceParams?.IsConcurrencyEnabled == true)
            {
                builder.AddConcurrency(serviceParams.ConcurrencyParams);
            }

            if (serviceParams?.IsTransactionsEnabled == true)
            {
                builder.AddTransactions(serviceParams.TransactionParams);
            }

            var build   = builder.Finalise().GetBuild();
            var factory = new EnhancedServiceFactory <Services.EnhancedOrgService>(build);

            return(new EnhancedServicePool <Services.EnhancedOrgService>(factory));
        }
コード例 #4
0
        public AsyncOrgServiceBase(EnhancedServiceParams parameters) : base(parameters)
        {
            if (!parameters.IsConcurrencyEnabled)
            {
                throw new UnsupportedException("Cannot initiate an async org service"
                                               + " unless concurrency is enabled.");
            }

            isAsyncAppHold = parameters.ConcurrencyParams.IsAsyncAppHold;
        }
コード例 #5
0
        public EnhancedServiceFactory(EnhancedServiceParams parameters)
        {
            var enhancedOrgType = typeof(TEnhancedOrgService);

            if (enhancedOrgType.IsAbstract)
            {
                throw new NotSupportedException("Given Enhanced Org type must be concrete.");
            }

            parameters.Require(nameof(parameters));

            var isCachingService = typeof(ICachingOrgService).IsAssignableFrom(typeof(TEnhancedOrgService));

            if (parameters.IsCachingEnabled == true && !isCachingService)
            {
                throw new NotSupportedException("Cannot create a caching service factory unless the given service is caching.");
            }

            SetPerformanceParams(parameters);

            parameters.IsLocked = true;
            Parameters          = parameters;

            customCacheFactory = parameters.CachingParams.CustomCacheFactory;

            if (parameters.IsCachingEnabled == true)
            {
                switch (parameters.CachingParams.CacheScope)
                {
                case CacheScope.Global:
                    factoryCache = customCacheFactory == null ? MemoryCache.Default : customCacheFactory(this, Parameters, null);
                    break;

                case CacheScope.Factory:
                    factoryCache = customCacheFactory == null
                                                        ? (parameters.CachingParams.ObjectCache ?? new MemoryCache(parameters.ConnectionParams.ConnectionString))
                                                        : customCacheFactory(this, Parameters, null);
                    break;

                case CacheScope.Service:
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(parameters.CachingParams.CacheScope));
                }
            }

            customServiceFactory = parameters.ConnectionParams.CustomIOrgSvcFactory ?? customServiceFactory;
        }
コード例 #6
0
        public virtual INodeService AddNode(EnhancedServiceParams serviceParams, int weight = 1)
        {
            serviceParams.Require(nameof(serviceParams), "Service Parameters must be set first.");
            weight.RequireAtLeast(1, nameof(weight));

            var node = new NodeService(serviceParams, weight);

            if (NodeQueue.IsEmpty)
            {
                SetPrimaryNode(node);
            }

            NodeQueue.Enqueue(node);

            return(node);
        }
コード例 #7
0
        private static void SetPerformanceParams(EnhancedServiceParams parameters)
        {
            if (parameters.ConnectionParams?.DotNetDefaultConnectionLimit.HasValue == true)
            {
                ServicePointManager.DefaultConnectionLimit = parameters.ConnectionParams.DotNetDefaultConnectionLimit.Value;
            }

            if (parameters.PoolParams?.DotNetSetMinAppReservedThreads.HasValue == true)
            {
                var minThreads = parameters.PoolParams.DotNetSetMinAppReservedThreads.Value;
                ThreadPool.SetMinThreads(minThreads, minThreads);
            }

            if (parameters.ConnectionParams?.IsDotNetDisableWaitForConnectConfirm.HasValue == true)
            {
                ServicePointManager.Expect100Continue =
                    !parameters.ConnectionParams.IsDotNetDisableWaitForConnectConfirm.Value;
            }

            if (parameters.ConnectionParams?.IsDotNetDisableNagleAlgorithm.HasValue == true)
            {
                ServicePointManager.UseNagleAlgorithm = !parameters.ConnectionParams.IsDotNetDisableNagleAlgorithm.Value;
            }
        }
コード例 #8
0
        public EnhancedServiceFactory(EnhancedServiceParams parameters)
        {
            this.parameters = parameters;

            if (parameters.IsCachingEnabled)
            {
                switch (parameters.CachingParams.CacheMode)
                {
                case CacheMode.Global:
                    factoryCache = MemoryCache.Default;
                    break;

                case CacheMode.Private:
                    factoryCache = parameters.CachingParams.ObjectCache ?? new MemoryCache(parameters.ConnectionString);
                    break;

                case CacheMode.PrivatePerInstance:
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(parameters.CachingParams.CacheMode));
                }
            }

            var isAsyncService = typeof(IAsyncOrgService).IsAssignableFrom(typeof(TEnhancedOrgService));

            if (parameters.IsConcurrencyEnabled && !isAsyncService)
            {
                throw new UnsupportedException("Cannot create an async service factory unless the given service is async.");
            }

            if (!parameters.IsConcurrencyEnabled && isAsyncService)
            {
                throw new UnsupportedException("Cannot create an async service factory unless concurrency is enabled.");
            }
        }
コード例 #9
0
        public static IEnhancedServicePool <ICachingOrgService> GetPoolCaching(EnhancedServiceParams serviceParams)
        {
            var factory = new EnhancedServiceFactory <ICachingOrgService, CachingOrgService>(serviceParams);

            return(new EnhancedServicePool <ICachingOrgService, CachingOrgService>(factory));
        }
コード例 #10
0
        public static IEnhancedServicePool <IEnhancedOrgService> GetPool(EnhancedServiceParams serviceParams)
        {
            var factory = new EnhancedServiceFactory <IEnhancedOrgService, Services.Enhanced.EnhancedOrgService>(serviceParams);

            return(new EnhancedServicePool <IEnhancedOrgService, Services.Enhanced.EnhancedOrgService>(factory));
        }
コード例 #11
0
 protected internal EnhancedOrgService(EnhancedServiceParams parameters) : base(parameters)
 {
 }
コード例 #12
0
 public AsyncOrgService(EnhancedServiceParams parameters) : base(parameters)
 {
 }
コード例 #13
0
 protected EnhancedOrgServiceBase(EnhancedServiceParams parameters)
 {
     Parameters = parameters;
 }
コード例 #14
0
        protected internal NodeService(EnhancedServiceParams @params, int weight = 1)
        {
            Params = @params;
            Weight = weight;

            LatencyEvaluator =
                new Thread(
                    () =>
            {
                var downtime = new Stopwatch();

                while (true)
                {
                    try
                    {
                        var stopwatch = new Stopwatch();
                        stopwatch.Start();

                        if (Status == NodeStatus.Offline)
                        {
                            Downtime += downtime.Elapsed;
                        }

                        downtime.Reset();
                        downtime.Start();

                        var thread =
                            new Thread(
                                () =>
                        {
                            try
                            {
                                LatencyEvaluatorService.Execute(new WhoAmIRequest());
                            }
                            catch (ThreadAbortException)
                            { }
                        });

                        if (!thread.Join(TimeSpan.FromSeconds(10)))
                        {
                            thread.Abort();
                            LatencyHistory.Enqueue(TimeSpan.MaxValue);
                            Status = NodeStatus.Unknown;
                            LatencyEvaluatorService.Execute(new WhoAmIRequest());
                        }

                        stopwatch.Stop();

                        LatencyHistory.Enqueue(stopwatch.Elapsed);
                        Status = NodeStatus.Online;
                    }
                    catch
                    {
                        LatencyHistory.Enqueue(TimeSpan.MaxValue);
                        Status = NodeStatus.Offline;
                    }
                    finally
                    {
                        Thread.Sleep((int?)LatencyInterval?.TotalMilliseconds ?? 10000);
                    }
                }
            });
        }