Esempio n. 1
0
        public void OnStop()
        {
            //Останавливаем таймер Starter
            if(this._timerStarter!=null)
                this._timerStarter.Stop();
            //Останавливаем таймер Scheduler
            if(this._timerScheduler!=null)
                this._timerScheduler.Stop();

            // активность: выключение
            DataDBService ddbs = new DataDBService();
            ddbs.WriteMessageAboutActivity(_dbConnectionString, 10001, "SPM остановлен.");
            ddbs.Dispose();
            GC.SuppressFinalize(ddbs);

            // незаконченные задания - сброс состояния "занято"

            DataDBJob job = new DataDBJob(_dbConnectionString, 10002, false, new string[20]);
            job.JobToNoBusy();
            job.Dispose();
            GC.SuppressFinalize(job);
        }
Esempio n. 2
0
        private bool CheckDBConnection(string currentMessage, int streamNumber, bool ifOk)
        {
            // Проверка соединения и активность: включение
            using (DataDBService ddbs = new DataDBService())
            using (SqlConnection conn = ddbs.GetDBCon(_dbConnectionString))
            {
                try
                {
                    if (conn != null)
                    {
                        conn.Close();
                        conn.Dispose();
                        if (ifOk)
                        {
                            ddbs.WriteMessageAboutActivity(_dbConnectionString, streamNumber, " Соединение с БД установлено. " + currentMessage);

                        }
                        return true;
                    }
                    else
                    {

                        ddbs.WriteMessageAboutActivity(_dbConnectionString, streamNumber, " Нет соединения с БД. Проверьте доступ. Или внесите изменения в 'dbconnect.txt' и перестартуйте сервис. " + currentMessage);
                        return false;
                    }
                }
                finally
                { conn.Close(); conn.Dispose(); }
            }
        }
Esempio n. 3
0
        private void _timer_Scheduler_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (!_startTimerScheduler) // в один поток
            {
                if (CheckDBConnection("SPM таймер запуска стартовал. ", 10002, false))
                {
                    _startTimerScheduler = true;
                    this._timerScheduler.Stop();

                    try
                    {
                        DataDBJob job = new DataDBJob(_dbConnectionString, 10002, false, new string[15]);
                        job.JobSchedule();
                    }
                    catch (Exception ex) // ловим ошибку соединения с БД
                    {
                        DataDBService ddbs = new DataDBService();
                        ddbs.WriteMessageAboutActivity(_dbConnectionString, 0, ex.Message);
                        ddbs.Dispose();
                        GC.SuppressFinalize(ddbs);
                    }
                    
                    this._timerScheduler.Start();
                    _startTimerScheduler = false;
                }
            }
        }
Esempio n. 4
0
        public void JobToNoBusy()
        {
            // при остановке сервиса
            // остающиеся в состоянии занято

            // имя хоста
            string hostName = Dns.GetHostName();
            //string ipAddress = "";

            // IP хоста
            IPHostEntry ipEntry = Dns.GetHostEntry(hostName);

            string SQLstr = "UPDATE PJobUpdate SET "
                  + "  StartType=6"
                  + " ,Busy=0, Start=1,  FirstPage = currentpage "
                  // --
                  + " Where "
                  + " Host = '" + hostName + "'"
                  //+ " and IP = '" + ipAddress + "'"
                  + " and Busy=1";

            using (DataDBService ddbs = new DataDBService())
            {
                string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);

                if (!string.IsNullOrEmpty(s))
                {
                    ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "JobToNoBusy. не смог выставить Start=1, Busy =0, работавшим задачам при остановке сервиса");

                    ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи изменения состояния задания по зависанию в занято при остановке сервиса. "
                         + _parserName + " " + _sourceDescription + ". " + s);
                }
            }
        }
Esempio n. 5
0
        public void JobSchedule()
        {
            // StartUp - не смотрим
            // Начальная страница обычного задания - из поля FirstPageForSchedule
            // Даты старта - из DateStart, если совпадает с текущей датой - текущая дата, иначе 01.01.1900 (скалярная ф-я sfGetJobDate)
            // Времена старта - истина, если текущее время больше не более, чем на minutes минут времени старта, ложь (скалярная ф-я sfGetJobTime)
            // Время в часах с момента DateEnd+TimeEnd - в часах (скалярная ф-я sfGetHoursFromEnd)


            if (GetTuningScheduler()) // данному парсеру разрешена работа планировщиком?
            {
                //StreamWriter _fileWrite;

                //добавлено 24.11.2014

                using (DataDBService ddbs = new DataDBService())
                {
                    ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п1. начинаю...");

                    // ежедневное 
                    //берем id, которые не запущены и не выствлен старт соответствуют (кроме авито,)
                    string SQLstr = "UPDATE PJobUpdate SET "
                                 + "  StartType=2"
                                 + " ,Start=1"
                                 + " ,NumberOfRestart = 0"
                                 + " ,FirstPage=isnull((select pv.FirstPageForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),1)"
                                 + " ,PageCount=isnull((select pv.PageCountForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),999)"
                        // --
                                 + " WHERE ID in  "
                                 + @"
                                    (
                                    SELECT DISTINCT ID FROM PJobView jv 
                                    OUTER APPLY  (select word from	dbo.split (TimeStart, '%,%') )spl
                                    WHERE StartUp=1 
                                    and
                                    
                                    (
                                    --сегоднящние
                                    (
                                    --запланированное время старта меньше текущего времени.
                                     substring(spl.word, patindex('%[^\.]%', spl.word),40)< SUBSTRING(CONVERT(nvarchar(32),CONVERT (time, CURRENT_TIMESTAMP)),0,CHARINDEX('.',CONVERT(nvarchar(32),CONVERT (time, CURRENT_TIMESTAMP)),0)-3)

                                    --дата начала парсинга меньше текущей даты +запланированное время старта (то есть сегодня не стартовала в нужное время)
                                    and (CONVERT(datetime,DateBegin,104) < convert(datetime,CONVERT (date, CURRENT_TIMESTAMP)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108)
                                    --для задач, которые стартуют более одного раза, чтобы выводились остаточные разы
                                    or CONVERT(datetime,DateEnd,104) < convert(datetime,CONVERT (date, CURRENT_TIMESTAMP)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108))
                                    )

                                    or
                                    --для вчерашних

                                    ( 
                                    --дата начала парсинга меньше текущей даты +запланированное время старта (то есть сегодня не стартовала в нужное время)
                                    CONVERT(datetime,DateBegin,104) < convert(datetime,cast (DATEADD(DAY,-1, CURRENT_TIMESTAMP) as date)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108)
                                    --для задач, которые стартуют более одного раза, чтобы выводились остаточные разы
                                    or CONVERT(datetime,DateEnd,104)< convert(datetime,cast (DATEADD(DAY,-1, CURRENT_TIMESTAMP) as date)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108)
                                    )
                                    )
                                    --and ParserName not like 'avito%' 
                                    and isnull(Busy,0)=0 and isnull(Start,0)=0 
                                    )
                                ";
                    string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);
                    //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString);
                    if (!string.IsNullOrEmpty(s))
                    {

                        ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Schedule. п1. не смог выставить Start задачам " + s);
                        ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Schedule. п1. не смог выставить Start задачам"
                            + _parserName + " " + _sourceDescription + ". " + s);
                    }



                    s = "";
                    ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п2. начинаю...");
                    //старт раз в 12 часов для тех, где превышено количество рестартов
                    SQLstr = "UPDATE PJobUpdate SET "
                              + "  StartType=3"
                              + " ,Start=1"
                              + " ,NumberOfRestart = 0"
                              + " ,FirstPage=isnull((select pv.FirstPageForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),1)"
                              + " ,PageCount=isnull((select pv.PageCountForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),999)"
                        // --разница между текущим временем и последней отпиской в базу больше 12 часов
                              + @" Where ID in
                                (
                                SELECT ID FROM PJobView where
                                StartUp=1
                                and NumberOfRestart > AllowRestarts 
                                --and ParserName not like 'avito%' 
                                and DATEDIFF(HOUR, CONVERT(datetime,LastDate,104), CURRENT_TIMESTAMP) > 12
                                )";
                    s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);
                    if (!string.IsNullOrEmpty(s))
                    {
                        ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п2. не смог выставить Start задачам " + s);

                        ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, " Schedule. п2. не смог выставить Start задачам, где NumberOfRestart>AllowRestarts и LastTime>12h"
                             + _parserName + " " + _sourceDescription + ". " + s);
                    }




                    s = "";
                    ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п3. начинаю...");

                    //24/11/2014 не совсем понимаю эту ситуацию, видо для тех, кто остался висеть после рестарта сервиса, но сейчас в JobToNoBusy() добавлено выставелние Start=1, скорее всего эта ситуация не повторится
                    // незавершенные / незанятые / не в старте (подхватываются в т.ч. после рестарта сервиса)
                    SQLstr = "UPDATE PJobUpdate SET "
                           + "  StartType=4"
                           + " ,Start=1"
                        // --
                           + " ,FirstPage=isnull((select pv.FirstPageForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),1)"
                           + " ,PageCount=isnull((select pv.PageCountForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),999)"
                        // --
                           + " Where isnull(Complete,0)=0"
                        //+ " and isnull(Startup,0)=1" //здесь этого не надо
                           + " and isnull(Start,0)=0"
                           + " and isnull(Busy,0)=0"
                           + " and isnull(CurrentPage,0)+1 < isnull(FirstPage,1)+isnull(PageCount,1)" // страниц меньше
                           + " and isnull(NumberOfRestart,0) > 0" // старты были
                           + " ";
                    s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);
                    if (!string.IsNullOrEmpty(s))
                    {
                        ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Schedule. п3. не смог выставить Start задачам " + s);
                        ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Schedule. п3. Ошибка записи изменения состояния задания по незавершено незанято."
                             + _parserName + " " + _sourceDescription + ". " + s);
                    }



                    s = "";
                    ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п4. начинаю...");
                    // зависшие в состоянии занято 
                    //change - 24/11/2014
                    SQLstr = "UPDATE PJobUpdate SET "
                          + "  StartType=5"
                          + " ,Busy=0, FirstPage = case when CurrentPage > 1 then CurrentPage-1 else 1 end, Start=1 "
                        // --
                          + @" Where ID in
                                (
                                SELECT ID FROM PJobView 
                                where  DATEDIFF(MINUTE, CONVERT(datetime,LastDate,104),CURRENT_TIMESTAMP) > ResetTimeInMinutes 
                                and isnull(Startup,0)=1 and isnull(Busy,0)=1 
                                ) ";
                    s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);
                    if (!string.IsNullOrEmpty(s))
                    {
                        ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Schedule. п4. не смог выставить Start задачам. " + s);

                        ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Schedule. п4. не смог выставить Start зависшим задачам (Busy=1)"
                             + _parserName + " " + _sourceDescription + ". " + s);
                    }
                }

            }
        }
Esempio n. 6
0
        private void SetJobStatus(int id, int status)
        {
            using (DataDBService ddbs = new DataDBService())
            {
                //update
                string SQLstr = "UPDATE [PJobUpdate] SET "
                                      + "  StartType=1"
                                      + " ,ParserStatus=" + status.ToString()
                                      + " Where ID = " + id.ToString();
                string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);

                if (!string.IsNullOrEmpty(s))
                {
                    ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Ошибка записи текущего состояния задания.");

                    ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи текущего состояния задания. "
                        + _parserName + " " + _sourceDescription + ". " + s + (status != 1 ? "Ошибка: статус " + status.ToString() + "." : ""));
                }

                if (status != 1)
                    ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, _startPage, "Ошибка: статус " + status.ToString() + ". jobID=" + _ID);
            }

            //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString);
        }