示例#1
0
        public async Task <IJobQueue <TArgs> > GetAsync <TArgs>()
        {
            var jobConfiguration = Options.GetJob(typeof(TArgs));

            if (JobQueues.TryGetValue(jobConfiguration.JobName, out var jobQueue))
            {
                return((IJobQueue <TArgs>)jobQueue);
            }

            using (await SyncSemaphore.LockAsync())
            {
                if (JobQueues.TryGetValue(jobConfiguration.JobName, out jobQueue))
                {
                    return((IJobQueue <TArgs>)jobQueue);
                }

                jobQueue = (IJobQueue <TArgs>)ServiceProvider
                           .GetRequiredService(typeof(IJobQueue <>).MakeGenericType(typeof(TArgs)));

                await jobQueue.StartAsync();

                JobQueues.TryAdd(jobConfiguration.JobName, jobQueue);

                return((IJobQueue <TArgs>)jobQueue);
            }
        }
示例#2
0
        public async Task StopAsync(CancellationToken cancellationToken = default)
        {
            foreach (var jobQueue in JobQueues.Values)
            {
                await jobQueue.StopAsync(cancellationToken);
            }

            JobQueues.Clear();
        }
示例#3
0
        public IJob OnQueue(string queue)
        {
            if (!JobQueues.Contains(queue))
            {
                throw new ArgumentException($"Queue is not defined: {queue}");
            }

            _queue = new EnqueuedState(queue.ToString());

            return(this);
        }
示例#4
0
        public IJobQueue <TArgs> Get <TArgs>()
        {
            var jobConfiguration = Options.GetJob(typeof(TArgs));

            return((IJobQueue <TArgs>)JobQueues.GetOrAdd(jobConfiguration.JobName, _ =>
            {
                var jobQueue = (IRunnable)ServiceProvider
                               .GetRequiredService(typeof(IJobQueue <>)
                                                   .MakeGenericType(typeof(TArgs)));

                AsyncHelper.RunSync(() => jobQueue.StartAsync());

                return jobQueue;
            }));
        }