Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Время работы джоба  [new]
IMNO
Member

Откуда:
Сообщений: 135
Добрый день.

Можно ли задать следующий интервал у ОДНОГО джоба:
Каждый день кроме выходных с 9 до 18 с интервалом 5 секунд?

Я пока только до двух додумался, но и то там есть вопросы.
3 сен 19, 10:01    [21962262]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
Synoptic
Member

Откуда:
Сообщений: 184
Можно конечно намутить INTERVAL, но ИМХО проще установить интервал 5 секунд, а уже в теле джоба проверять текущий день (выходной/рабочий) и время (рабочее/не рабочее)
3 сен 19, 10:15    [21962274]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
-2-
Member

Откуда:
Сообщений: 15330
Выходные с интервалом 5 секунд - это секунду работаю, четыре секунды выходной (по аналогии "сутки через трое")?
3 сен 19, 10:15    [21962275]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
IMNO
Member

Откуда:
Сообщений: 135
Synoptic
Можно конечно намутить INTERVAL, но ИМХО проще установить интервал 5 секунд, а уже в теле джоба проверять текущий день (выходной/рабочий) и время (рабочее/не рабочее)

Да, тоже примерно об этом думал. Запустить навсегда с интервалом 5 секунд, а в функции уже контролировать дату и время выполнения логики.

-2-
Выходные с интервалом 5 секунд - это секунду работаю, четыре секунды выходной (по аналогии "сутки через трое")?

Пн: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Вт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Ср: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Чт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Пт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Сб: 00:00-23:59 не выполняется
Вс: 00:00-23:59 не выполняется

Интервал 5 сек. Начало в 08:00:00.
Следующие вызовы: 08:00:00, 08:00:05, 08:00:10, 08:00:15, 08:00:20, 08:00:25, 08:00:30, 08:00:35, 08:00:40, 08:00:45 и т.д.

Так как функция выполняется 1сек (реально меньше), то фактически получается "секунду работаю, четыре секунды выходной".
3 сен 19, 10:47    [21962295]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
Synoptic
Member

Откуда:
Сообщений: 184
Ещё вариант, организовать в теле джоба бесконечный цикл и в теле сделать проверку текущего дня/времени, а в конце цикла задержку с помощью Dbms_Lock.sleep(5)
Тогда вообще не нужно думать над сложным интервалом.
3 сен 19, 10:54    [21962302]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
IMNO,

выходной не обязательно суббота/воскресенье и наоборот

в древних версиях ф-ция имела параметр Next_Date IN OUT DATE (время следующего запуска), я б определял время запуска в ф-ции и возвращал его "субмиту"

зы
в соременной субд возможно надо юзать шедюлер с расписанием

.....
stax
3 сен 19, 11:17    [21962319]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
IMNO
Synoptic
Можно конечно намутить INTERVAL, но ИМХО проще установить интервал 5 секунд, а уже в теле джоба проверять текущий день (выходной/рабочий) и время (рабочее/не рабочее)

Да, тоже примерно об этом думал. Запустить навсегда с интервалом 5 секунд, а в функции уже контролировать дату и время выполнения логики.

-2-
Выходные с интервалом 5 секунд - это секунду работаю, четыре секунды выходной (по аналогии "сутки через трое")?

Пн: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Вт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Ср: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Чт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Пт: 08:00-17:59 выполняется, 18:00-07:59 не выполняется
Сб: 00:00-23:59 не выполняется
Вс: 00:00-23:59 не выполняется

Интервал 5 сек. Начало в 08:00:00.
Следующие вызовы: 08:00:00, 08:00:05, 08:00:10, 08:00:15, 08:00:20, 08:00:25, 08:00:30, 08:00:35, 08:00:40, 08:00:45 и т.д.

Так как функция выполняется 1сек (реально меньше), то фактически получается "секунду работаю, четыре секунды выходной".

begin
  sys.dbms_scheduler.create_job(job_name            => 'MY_JOB',
                                job_type            => 'PLSQL_BLOCK',
                                job_action          => '',
                                start_date          => sysdate,
                                repeat_interval     => 'Freq=Secondly;Interval=5;ByDay=Mon, Tue, Wed, Thu, Fri;ByHour=08, 09, 10, 11, 12, 13, 14, 15, 16, 17',
                                end_date            => to_date(null),
                                job_class           => '',
                                enabled             => true,
                                auto_drop           => false,
                                comments            => '');
end;
/
3 сен 19, 11:19    [21962320]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
feagor,

для случаев, когда доп.праздники, переносы, использовать доп. расписание рабочих/выходных дней через
include_clause = "INCLUDE" "=" schedule_list
exclude_clause = "EXCLUDE" "=" schedule_list
3 сен 19, 11:37    [21962340]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
IMNO
Member

Откуда:
Сообщений: 135
feagor
feagor,

для случаев, когда доп.праздники, переносы, использовать доп. расписание рабочих/выходных дней через
include_clause = "INCLUDE" "=" schedule_list
exclude_clause = "EXCLUDE" "=" schedule_list


Ну учитывая рабочие, проще тогда уже сделать, как Synoptic предложил. Запускаем навсегда, но контролируем ифами в функции.

Всем спасибо.
3 сен 19, 11:39    [21962344]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
feagor
Member

Откуда: Москва
Сообщений: 256
IMNO,

судя по тому, что вы запускаете это каждые 5 секунд - предполагаю, что чекаете поступление каких-то данных и обрабатываете их.
В вашем случае возможно будет лучше использовать DBMS_AQ с запуском DEQUEUE по событию
3 сен 19, 12:10    [21962373]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
mlader
Member

Откуда:
Сообщений: 11
Возможно, будет полезно. У меня была похожая задача, но мне нужно было менять время следующего запуска джоба в зависимости от условий, и заранее неизвестно, будет выполнено условие или нет.
В моём случае джоб звал процедуру, внутри процедуры проверялось условие.
Если условие выполнено, изменяется время следующего джоба на завтра. Если условие не выполнено, изменяется время следующего джоба на "через пять минут". С такой процедурой есть возможность навешивать сложные условия (не только буден/выходной) на время следующего выполнения джоба.

Для изменения времени джоба написал такую процедуру:

create or replace procedure JOB_CHANGE(JOB_ID in NUMBER,
                                           JOB_COMMAND in VARCHAR2,
                                           JOB_NEXT_DATE in DATE,
                                           JOB_INTERVAL in VARCHAR2
                                           )
as
   --V типа variable. 
   V_JOB_COMMAND VARCHAR(400);
   V_JOB_NEXT_DATE DATE;
   V_JOB_INTERVAL VARCHAR(400);
   
   --R - типа "результат". Значение, которое подадим для изменения значения джоба.
   R_JOB_COMMAND VARCHAR(400);
   R_JOB_NEXT_DATE DATE;
   R_JOB_INTERVAL VARCHAR(400);
   
begin
  

  
   SELECT TO_CHAR(J.WHAT) INTO V_JOB_COMMAND FROM ALL_JOBS J WHERE J.JOB = JOB_ID;
   IF JOB_COMMAND IS NULL THEN
     R_JOB_COMMAND := V_JOB_COMMAND;
   ELSE
     R_JOB_COMMAND := JOB_COMMAND;
   END IF;
   
   SELECT J.NEXT_DATE INTO V_JOB_NEXT_DATE FROM ALL_JOBS J WHERE J.JOB = JOB_ID;
   IF V_JOB_NEXT_DATE IS NULL THEN
     R_JOB_NEXT_DATE := V_JOB_NEXT_DATE;
   ELSE
     R_JOB_NEXT_DATE := JOB_NEXT_DATE;
   END IF;   
   
   SELECT TO_CHAR(J.INTERVAL) INTO V_JOB_INTERVAL FROM ALL_JOBS J WHERE J.JOB = JOB_ID;
   IF JOB_INTERVAL IS NULL THEN
     R_JOB_INTERVAL := V_JOB_INTERVAL;
   ELSE
     R_JOB_INTERVAL := JOB_INTERVAL;
   END IF;

   sys.dbms_job.change(job => JOB_ID,
                       what => R_JOB_COMMAND,
                       next_date => R_JOB_NEXT_DATE,
                       interval => R_JOB_INTERVAL);
   commit;
end;
5 сен 19, 14:53    [21964627]     Ответить | Цитировать Сообщить модератору
 Re: Время работы джоба  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Ерундой не надо заниматься
Stax уже намекнул, что можно выставить врямя следующего запуска прямо в переменной NEXT_DATE
С DBMS_SCHEDULER это тоже работает

PS. Но по условию первоначальной задачи (безо всяких праздников) самый красивый/переносимый/правильный вариант таки от feagor 21962320
5 сен 19, 15:07    [21964652]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить