В этой части будет продемонстрировано каким образом создавать задания с несколькими шагами, а так же как создать задание выполняющееся периодически.
Задания с несколькими шагами
Прежнее API для создания фоновых задач позволяло создавать их с несколькими шагами. Делалось это с помощью функциональных модулей: JOB_OPEN — создание задачи, JOB_SUBMIT — планирование шага в задаче. В новом API на классах это реализовано, но довольно странно.
Для создания задачи с несколькими шагами был реализован метод в абстрактном классе: CL_BP_JOB, метод: GENERATE_JOB_COUNT. Обратиться к нему можно только через интерфейс. Для создания шага в CL_BP_ABAP_JOB создан метод PLAN_JOB_STEP( ), но по непонятной причине алиас к нему не прописан, в итоге приходится обращаться так же через интерфейс.
В итоге пример создания задания с несколькими шагами получился таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
REPORT zbg_api. DATA: lo_abapjob TYPE REF TO cl_bp_abap_job. lo_abapjob = cl_bp_job_factory=>make_abap_job( ). " Устанавливаем имя для фонового задания lo_abapjob->set_name( i_name = 'ZTESTJOB' ). " Определяем шаг запуска ABAP отчёта lo_abapjob->set_report( i_report = 'ZTEPORT_ONE' ). " Вариант с которым он будет запущен lo_abapjob->set_variant( i_variant = 'TEST' ). " Под каким пользователем он будет выполнен lo_abapjob->set_effective_user( i_authcknam = sy-uname ). " Под каким языком lo_abapjob->set_language( i_language = sy-langu ). " Поведение реализовано "заранее" в абстрактном классе lo_abapjob->if_bp_job_engine~generate_job_count( ). " Метод переопределен, но доступ к нему можно получить только " через интерфейс т.к. алиаса нет lo_abapjob->if_bp_job_engine~plan_job_step( ). " Определяем шаг запуска ABAP отчёта lo_abapjob->set_report( i_report = 'ZREPORT_TWO' ). " Вариант с которым он будет запущен lo_abapjob->set_variant( i_variant = 'TEST2' ). lo_abapjob->if_bp_job_engine~plan_job_step( ). lo_abapjob->if_bp_job_engine~start_immediately( ). |
Повторяющиеся задания
Повторяющиеся задания или задания с определенной периодичностью создаются с использованием класса: cl_bp_periodic_job
Периоды выполнения задаются с помощью класса: cl_bp_job_periodicity. Для задачи необходимо определить шаблон шага, шаблоны могут быть 3х видов. Создание класса шаблона выполняется с помощью статических методов класса cl_bp_job_factory. Далее пример кода запускающего задачу и определяющего ее периодичность:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
REPORT zbg_api. DATA: " Объект определяющий периодическое задание lo_periodicjob TYPE REF TO cl_bp_periodic_job, " Объект настраивающий периодичность запуска задачи lo_periodicity TYPE REF TO cl_bp_job_periodicity, " Триггер определяющий событие по которому необходимо запускать задачу lo_trigger TYPE REF TO cl_tc_date_trigger, lv_time TYPE sy-uzeit, " Объект шаблона задания lo_abapjob_tmpl TYPE REF TO cl_bp_abap_job_template. " Создаем шаблон ABAP задачи lo_abapjob_tmpl = cl_bp_job_factory=>make_abap_job_tmpl( ). " Создаем объект периодической задачи lo_periodicjob = cl_bp_job_factory=>make_periodic_job( ). " Создаем триггер lo_trigger = cl_tc_trigger_factory=>make_date_trigger( ). " Создаем класс настройщик периодичности CREATE OBJECT lo_periodicity. " Настриваем шаблон, планируем к запуску lo_abapjob_tmpl->set_name( i_name = 'ZTEST' ). lo_abapjob_tmpl->set_report( i_report = 'ZREPORT' ). lo_abapjob_tmpl->set_variant( i_variant = 'TEST' ). lo_abapjob_tmpl->set_language( i_language = sy-langu ). lo_abapjob_tmpl->set_effective_user( i_authcknam = sy-uname ). lo_abapjob_tmpl->plan_job( ). " Настраиваем переодичность выполнения lo_periodicity->set_event_periodic( ). " Запускать ежедневно: lo_periodicity->set_num_days( i_days = 1 ). " Настраиваем триггер lo_trigger->set_sdlstrtdt( i_sdlstrtdt = sy-datum ). lv_time = sy-uzeit + 5. lo_trigger->set_sdlstrttm( i_sdlstrttm = lv_time ). " Настраиваем переодически выполняемую задачу lo_periodicjob->set_name( i_name = 'ZTEST' ). lo_periodicjob->set_trg_type( i_trg_type = 'DATE' ). lo_periodicjob->attach_job_template( i_job_template = lo_abapjob_tmpl ). lo_periodicjob->attach_periodicity( i_periodicity = lo_periodicity ). " Запускаем lo_periodicjob->release_job( i_trg_obj = lo_trigger ). |
Обратите внимание что обработка исключений опущена специально, чтобы не увеличивать размер кода.
Спасибо за информацию!
Тот пост был случайным.