public Task <bool> PublishManyAsync(IEnumerable <JobExecution> jobExecutions, CancellationToken ctx)
        {
            using var _   = MessagingMetrics.TimeBatchPublishDuration();
            jobExecutions = jobExecutions.ToList();

            try
            {
                if (!TryGetOrCreateModel(out var model) || model is null)
                {
                    return(Task.FromResult(false));
                }
                var batchPublish = model.CreateBasicPublishBatch();

                jobExecutions.GroupBy(j => j.Job.Subject).ToList().ForEach(g =>
                {
                    model.EnsureConfig(_options.JobsExchange, g.Key);
                    foreach (var jobExecution in g.ToList())
                    {
                        batchPublish.Add(_options.JobsExchange, jobExecution.Job.Subject, true, null, new ReadOnlyMemory <byte>(Encoding.UTF8.GetBytes(jobExecution.Job.Payload)));
                    }

                    MessagingMetrics.MessagesPublished(g.Key, g.Count());
                });

                batchPublish.Publish();
                return(Task.FromResult(model.WaitForConfirms()));
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Failed to batch publish {JobIds} to RabbitMQ", jobExecutions.Select(j => j.Job.Id));
                return(Task.FromResult(false));
            }
        }
        public async Task <bool> PublishManyAsync(IEnumerable <JobExecution> jobExecutions, CancellationToken ctx)
        {
            jobExecutions = jobExecutions.ToList();
            if (!jobExecutions.Any())
            {
                return(true);
            }

            if (_options.PartitionedQueue)
            {
                return(await PublishPartitioned(jobExecutions, ctx));
            }
            else
            {
                return(await PublishBatched(jobExecutions, ctx));
            }

            async Task <bool> PublishPartitioned(IEnumerable <JobExecution> jobExecutions, CancellationToken ctx)
            {
                var tasks  = jobExecutions.Select(jobExecution => PublishAsync(jobExecution, ctx));
                var result = await Task.WhenAll(tasks);

                // Any tasks failed -> we consider the batch to be failed
                return(result.Contains(false) is false);
            }

            async Task <bool> PublishBatched(IEnumerable <JobExecution> jobExecutions, CancellationToken ctx)
            {
                using var _ = MessagingMetrics.TimeBatchPublishDuration();

                var messages = jobExecutions.Select(jobExecution =>
                                                    new ServiceBusMessage(jobExecution.Job.Payload)
                {
                    MessageId = jobExecution.Id.ToString(),
                    Subject   = jobExecution.Job.Subject,
                });

                jobExecutions
                .GroupBy(jobExecution => jobExecution.Job.Subject)
                .ToList()
                .ForEach(jobGroup =>
                         MessagingMetrics.MessagesPublished(jobGroup.Key, jobGroup.Count()));

                return(await WithSenderAsync(conn => conn.SendMessagesAsync(messages, ctx)));
            }
        }