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); }
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"); } }
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}"); }; }
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); }