private static async Task InitializeSeedDataAsync(PortalDbContext context, IScheduler sched) { if (!await context.DockerRepositories.AnyAsync()) { var repo = new DockerRepository { Name = "DockerHub", Schema = null, Registry = null, Repository = "dotnetspider/spiders.startup", CreationTime = DateTimeOffset.Now, UserName = "", Password = "" }; await context.DockerRepositories.AddAsync(repo); var spider = new Data.Spider { Name = "cnblogs", Cron = "0 1 */1 * * ?", Repository = "dotnetspider/spiders.startup", Type = "DotnetSpider.Spiders.CnblogsSpider", Tag = "latest", CreationTime = DateTimeOffset.Now }; await context.Spiders.AddAsync(spider); await context.SaveChangesAsync(); var trigger = TriggerBuilder.Create().WithCronSchedule(spider.Cron) .WithIdentity(spider.Id.ToString()) .Build(); var qzJob = JobBuilder.Create <QuartzJob>().WithIdentity(spider.Id.ToString()) .WithDescription(spider.Name) .RequestRecovery(true).Build(); await sched.ScheduleJob(qzJob, trigger); } }
private void InitializedData(PortalDbContext context, IScheduler sched) { if (!context.DockerRepositories.Any()) { var repo = new DockerRepository { Name = "DockerHub", Schema = null, Registry = null, Repository = "dotnetspider/spiders.startup", CreationTime = DateTime.Now, UserName = "", Password = "" }; context.DockerRepositories.Add(repo); var spider = new Entity.Spider { Name = "cnblogs", Cron = "0 1 */1 * * ?", Repository = "dotnetspider/spiders.startup", Type = "DotnetSpider.Spiders.CnblogsSpider", Tag = "latest", CreationTime = DateTime.Now }; context.Spiders.Add(spider); context.SaveChanges(); var trigger = TriggerBuilder.Create().WithCronSchedule(spider.Cron).WithIdentity(spider.Id.ToString()) .Build(); var qzJob = JobBuilder.Create <TriggerJob>().WithIdentity(spider.Id.ToString()) .WithDescription(spider.Name) .RequestRecovery(true).Build(); sched.ScheduleJob(qzJob, trigger).GetAwaiter().GetResult(); } }
public static async Task RunAsync(PortalOptions options, PortalDbContext dbContext, int jobId) { var spider = await dbContext.Spiders.FirstOrDefaultAsync(x => x.Id == jobId); if (spider == null) { throw new Exception($"任务 {jobId} 不存在"); } var docker = new DockerClient.DockerClient(new Uri(options.Docker)); bool exists = await docker.ExistsAsync(new { label = new[] { $"dotnetspider.spider.id={spider.Id}" } }); if (exists) { throw new Exception($"任务 {spider.Id} 正在运行"); } var env = new List <string>((spider.Environment ?? "").Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)) { $"id={spider.Id}", $"type={spider.Type}", $"name={spider.Name}" }; var result = await docker.PullAsync(spider.Image); if (!result.Success) { throw new Exception($"接取镜像 {spider.Image} 失败: {result.Message}"); } result = await docker.CreateAsync(spider.Image, env.ToArray(), new Dictionary <string, object> { { "id", spider.Id.ToString() }, { "type", spider.Type }, { "name", spider.Name } }, new[] { options.DockerVolumes }); if (!result.Success) { throw new Exception($"创建任务 {jobId} 实例失败: {result.Message}"); } var spiderContainer = new SpiderContainer { ContainerId = result.Id, SpiderId = spider.Id, Status = "Creating" }; result = await docker.StartAsync(spiderContainer.ContainerId); if (result.Success) { spiderContainer.Status = "OK"; } dbContext.SpiderContainers.Add(spiderContainer); await dbContext.SaveChangesAsync(); }