コード例 #1
0
        private (RebalanserClient, List <TestEvent> testEvents) CreateClient()
        {
            var client1    = new RebalanserClient();
            var testEvents = new List <TestEvent>();

            client1.OnAssignment += (sender, args) =>
            {
                testEvents.Add(new TestEvent()
                {
                    EventType = EventType.Assignment,
                    Resources = args.Resources
                });
            };

            client1.OnUnassignment += (sender, args) =>
            {
                testEvents.Add(new TestEvent()
                {
                    EventType = EventType.Unassignment
                });
            };

            client1.OnAborted += (sender, args) =>
            {
                testEvents.Add(new TestEvent()
                {
                    EventType = EventType.Error
                });
                Console.WriteLine($"OnAborted: {args.AbortReason} {args.Exception.ToString()}");
            };

            return(client1, testEvents);
        }
コード例 #2
0
        private static async Task RunRebalanserAsync(string rabbitMQHost, string consumerGroup, string outputQueue, CancellationToken token)
        {
            Providers.Register(GetProvider);
            ConsumerTasks = new List <ConsumerTask>();

            while (!token.IsCancellationRequested)
            {
                using (var client = new RebalanserClient())
                {
                    client.OnAssignment += (sender, args) =>
                    {
                        foreach (var queue in args.Resources)
                        {
                            StartConsumingAndPublishing(rabbitMQHost, queue, outputQueue);
                        }
                    };

                    client.OnUnassignment += (sender, args) =>
                    {
                        StopAllConsumptionAsync().GetAwaiter().GetResult();
                    };

                    client.OnAborted += (sender, args) =>
                    {
                        if (args.Exception != null)
                        {
                            LogInfo($"Error: {args.AbortReason} Exception: {args.Exception}");
                        }
                        else
                        {
                            LogInfo($"Error: {args.AbortReason}");
                        }
                    };

                    var clientOptions = new ClientOptions()
                    {
                        AutoRecoveryOnError = true,
                        RestartDelay        = TimeSpan.FromSeconds(30),
                        OnAssignmentDelay   = TimeSpan.FromSeconds(30) // ensure this is longer than the keep alive timeout
                    };
                    await client.StartAsync(consumerGroup, clientOptions);

                    await client.BlockAsync(token, TimeSpan.FromSeconds(30));
                }

                if (!token.IsCancellationRequested)
                {
                    LogInfo("The Rebalanser client has aborted. Creating new client in 30 seconds");
                    await Task.Delay(TimeSpan.FromSeconds(30));
                }
            }

            if (token.IsCancellationRequested)
            {
                LogInfo("The Rebalanser client has been cancelled and shutdown");
            }
        }
コード例 #3
0
        private void CreateNewClient(ILogger logger)
        {
            Id = $"Client{ClientNumber}";
            ClientNumber++;
            Monitor.RegisterAddClient(Id);
            Client = new RebalanserClient();
            Client.OnAssignment += (sender, args) =>
            {
                Resources = args.Resources;
                foreach (var resource in args.Resources)
                {
                    Monitor.ClaimResource(resource, Id);
                }

                if (this.onStartTime > TimeSpan.Zero)
                {
                    if (randomiseTimes)
                    {
                        var waitTime = this.onStartTime.TotalMilliseconds * this.rand.NextDouble();
                        Thread.Sleep((int)waitTime);
                    }
                    else
                    {
                        Thread.Sleep(this.onStartTime);
                    }
                }
            };

            Client.OnUnassignment += (sender, args) =>
            {
                foreach (var resource in Resources)
                {
                    Monitor.ReleaseResource(resource, Id);
                }

                Resources.Clear();

                if (this.onStopTime > TimeSpan.Zero)
                {
                    if (randomiseTimes)
                    {
                        var waitTime = this.onStopTime.TotalMilliseconds * this.rand.NextDouble();
                        Thread.Sleep((int)waitTime);
                    }
                    else
                    {
                        Thread.Sleep(this.onStopTime);
                    }
                }
            };

            Client.OnAborted += (sender, args) =>
            {
                logger.Info("CLIENT", $"CLIENT ABORTED: {args.AbortReason}");
            };
        }
コード例 #4
0
        private (RebalanserClient, List <TestEvent> testEvents) CreateClient()
        {
            var client1 = new RebalanserClient(ZkHelper.ZooKeeperHosts,
                                               "/rebalanser",
                                               TimeSpan.FromSeconds(20),
                                               TimeSpan.FromSeconds(20),
                                               TimeSpan.FromSeconds(5),
                                               new TestOutputLogger());
            var testEvents = new List <TestEvent>();

            client1.OnAssignment += (sender, args) =>
            {
                testEvents.Add(new TestEvent()
                {
                    EventType = EventType.Assignment,
                    Resources = args.Resources
                });
            };

            client1.OnUnassignment += (sender, args) =>
            {
                testEvents.Add(new TestEvent()
                {
                    EventType = EventType.Unassignment
                });
            };

            client1.OnAborted += (sender, args) =>
            {
                testEvents.Add(new TestEvent()
                {
                    EventType = EventType.Error
                });
                Console.WriteLine($"OnAborted: {args.Exception.ToString()}");
            };

            return(client1, testEvents);
        }