Ejemplo n.º 1
0
        internal void ExecuteWithVirtualNetworkLoadBalancing <TArgA, TArgB>(Func <TArgA, TArgB, string, Task> method, TArgA arg1, TArgB arg2)
        {
            if (_loadBalancer == null)
            {
                method.Invoke(arg1, arg2, null).Wait();
            }
            else
            {
                int numRetries = _loadBalancer.GetNumAvailableEndpoints();
                LoadBalancingHelper.Execute(() =>
                {
                    var endpoint = _loadBalancer.GetEndpoint();
                    Contract.Assert(endpoint != null, "Load balancer failed to return a worker node endpoint!");

                    Trace.TraceInformation("\tIssuing request to endpoint " + endpoint);

                    try
                    {
                        method.Invoke(arg1, arg2, endpoint.ToString()).Wait();
                        _loadBalancer.RecordSuccess(endpoint);
                    }
                    catch (Exception)
                    {
                        _loadBalancer.RecordFailure(endpoint);
                        throw;
                    }
                },
                                            new RetryOnAllExceptionsPolicy(),
                                            new NoOpBackOffScheme(), numRetries: numRetries);
            }
        }
Ejemplo n.º 2
0
        internal TResult ExecuteAndGetWithVirtualNetworkLoadBalancing <TArg, TResult>(Func <TArg, string, Task <TResult> > method, TArg arg1)
        {
            if (_loadBalancer == null)
            {
                return(method.Invoke(arg1, null).Result);
            }
            else
            {
                TResult result = default(TResult);

                int numRetries = _loadBalancer.GetNumAvailableEndpoints();
                LoadBalancingHelper.Execute(() =>
                {
                    var endpoint = _loadBalancer.GetEndpoint();
                    Contract.Assert(endpoint != null, "Load balancer failed to return a worker node endpoint!");

                    Trace.TraceInformation("\tIssuing request to endpoint " + endpoint);

                    try
                    {
                        result = method.Invoke(arg1, endpoint.ToString()).Result;
                        _loadBalancer.RecordSuccess(endpoint);
                    }
                    catch (Exception)
                    {
                        _loadBalancer.RecordFailure(endpoint);
                        throw;
                    }
                },
                                            new RetryOnAllExceptionsPolicy(),
                                            new NoOpBackOffScheme(), numRetries: numRetries);

                return(result);
            }
        }