Example #1
0
        /// <summary>
        /// 获取爬虫标识和名称
        /// </summary>
        /// <returns></returns>
        protected virtual SpiderId GenerateSpiderId()
        {
            var id = Environment.GetEnvironmentVariable("DOTNET_SPIDER_ID");

            id = string.IsNullOrWhiteSpace(id) ? ObjectId.CreateId().ToString() : id;
            var name = Environment.GetEnvironmentVariable("DOTNET_SPIDER_NAME");

            return(new SpiderId(id, name));
        }
        /// <summary>
        /// 只有本地爬虫才能配置下载器,分布式爬虫的下载器注册是在下载器代理中
        /// </summary>
        /// <param name="builder"></param>
        /// <typeparam name="TDownloader"></typeparam>
        /// <returns></returns>
        public static Builder UseDownloader <TDownloader>(this Builder builder)
            where TDownloader : class, IDownloader
        {
            builder.ConfigureServices(x =>
            {
                x.AddTransient <HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
                x.AddAgent <TDownloader>(opts =>
                {
                    opts.AgentId   = ObjectId.CreateId().ToString();
                    opts.AgentName = opts.AgentId;
                });
            });

            return(builder);
        }
Example #3
0
 protected override SpiderId GenerateSpiderId()
 {
     return(new(ObjectId.CreateId().ToString(), "博客园"));
 }
Example #4
0
 protected Message()
 {
     MessageId = ObjectId.CreateId().ToString();
 }
Example #5
0
        public async Task Execute(IJobExecutionContext context)
        {
            var jobId = context.JobDetail.Key.Name;

            using var scope = ServiceProvider.Instance.CreateScope();
            var services = scope.ServiceProvider;
            var logger   = services.GetRequiredService <ILogger <QuartzJob> >();

            logger.LogInformation($"触发任务 {jobId}");
            try
            {
                var options   = services.GetRequiredService <PortalOptions>();
                var dbContext = services.GetRequiredService <PortalDbContext>();

                var spider = await dbContext.Spiders.FirstOrDefaultAsync(x => x.Id == int.Parse(jobId));

                if (spider == null)
                {
                    logger.LogError($"任务 {jobId} 不存在");
                    return;
                }

                if (!spider.Enabled)
                {
                    logger.LogError($"任务 {jobId} 被禁用");
                    return;
                }

                var client = new DockerClientConfiguration(
                    new Uri(options.Docker))
                             .CreateClient();
                var batch = ObjectId.CreateId().ToString();
                var env   = new List <string>((spider.Environment ?? "").Split(new[] { " ", "\n" },
                                                                               StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()))
                {
                    $"DOTNET_SPIDER_ID={batch}",
                    $"DOTNET_SPIDER_NAME={spider.Name}"
                };

                var name       = $"dotnetspider-{spider.Id}-{batch}";
                var parameters = new CreateContainerParameters
                {
                    Image  = spider.Image,
                    Name   = name,
                    Labels = new Dictionary <string, string>
                    {
                        { "dotnetspider.spider.id", spider.Id.ToString() },
                        { "dotnetspider.spider.batch", batch },
                        { "dotnetspider.spider.name", spider.Name }
                    },
                    Env        = env,
                    HostConfig = new HostConfig()
                };
                var volumes = new HashSet <string>();
                foreach (var volume in options.DockerVolumes)
                {
                    volumes.Add(volume);
                }

                var configVolumes = new List <string>((spider.Volume ?? "").Split(new[] { " ", "\n" },
                                                                                  StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()));
                foreach (var volume in configVolumes)
                {
                    volumes.Add(volume);
                }

                parameters.HostConfig.Binds = volumes.ToList();

                var result = await client.Containers.CreateContainerAsync(parameters);

                if (result.ID == null)
                {
                    logger.LogError($"创建任务 {jobId} 实例失败: {string.Join(", ", result.Warnings)}");
                }

                var spiderContainer = new SpiderHistory
                {
                    ContainerId  = result.ID,
                    Batch        = batch,
                    SpiderId     = spider.Id,
                    SpiderName   = spider.Name,
                    Status       = "Created",
                    CreationTime = DateTimeOffset.Now
                };

                dbContext.SpiderHistories.Add(spiderContainer);
                await dbContext.SaveChangesAsync();

                var startResult =
                    await client.Containers.StartContainerAsync(result.ID, new ContainerStartParameters());

                spiderContainer.Status = startResult ? "Success" : "Failed";

                await dbContext.SaveChangesAsync();

                logger.LogInformation($"触发任务 {jobId} 完成");
            }
            catch (Exception ex)
            {
                logger.LogError($"触发任务 {jobId} 失败: {ex}");
            }
        }