Example #1
0
        protected override void PreInitComponent(params string[] arguments)
        {
            if (Entities == null || Entities.Count == 0)
            {
                throw new SpiderException("Count of entity is zero.");
            }

            if (EntityPipelines == null || EntityPipelines.Count == 0)
            {
                throw new SpiderException("Need at least one entity pipeline.");
            }

            foreach (var entity in Entities)
            {
                var pipelines = new List <BaseEntityPipeline>();
                foreach (var pipeline in EntityPipelines)
                {
                    BaseEntityPipeline newPipeline = pipeline.Clone();
                    newPipeline.InitEntity(entity);
                    if (newPipeline.IsEnabled)
                    {
                        pipelines.Add(newPipeline);
                    }
                }
                if (pipelines.Count > 0)
                {
                    AddPipeline(new EntityPipeline(entity.Entity.Name, pipelines));
                }
            }

            bool needInitStartRequest = true;
            var  redisConnectString   = Configuration.GetValue("redis.connectString");

            if (!string.IsNullOrEmpty(redisConnectString))
            {
                RedisConnection = Cache.Instance.Get(redisConnectString);
                if (RedisConnection == null)
                {
                    RedisConnection = new Infrastructure.RedisConnection(redisConnectString);
                    Cache.Instance.Set(redisConnectString, RedisConnection);
                }
            }


            if (RedisConnection != null)
            {
                while (!RedisConnection.Database.LockTake(InitLockKey, "0", TimeSpan.FromMinutes(10)))
                {
                    Thread.Sleep(1000);
                }
                var lockerValue = RedisConnection.Database.HashGet(InitStatusSetKey, Identity);
                needInitStartRequest = lockerValue != "init finished";
            }

            if (arguments.Contains("rerun"))
            {
                Scheduler.Init(this);
                Scheduler.Dispose();
                if (RedisConnection != null)
                {
                    RedisConnection.Database.HashDelete(ValidateStatusKey, Identity);
                }
                needInitStartRequest = true;
            }

            if (needInitStartRequest && PrepareStartUrls != null)
            {
                for (int i = 0; i < PrepareStartUrls.Length; ++i)
                {
                    var prepareStartUrl = PrepareStartUrls[i];
                    this.Log($"[步骤 {i + 2}] 添加链接到调度中心.", LogLevel.Info);
                    prepareStartUrl.Build(this, null);
                }
            }

            RegisterControl(this);

            base.PreInitComponent();
        }