:::: МЕНЮ ::::

RFC модули и параллельная обработка

RFC (Remote Function Call) — протокол обмена данными между системами (подробно о SAP RFC написано в курсе BC415). RFC применяются для интеграции SAP и не SAP систем, обработки данных в новой сессии, параллельной обработки данных и т.п.

Классификация RFC

  • Синхронный RFC или sRFC. Определяется с помощью дополнения DESTINATION. При вызове sRFC рабочий процесс приостанавливает свою работу пока вызываемый sRFC модуль не завершит свою работу. Вызов sRFC выполняется в отдельном DB LUW. При вызове sRFC в основном процессе происходит неявный COMMIT.
  • Асинхронные RFC – определяются с помощью дополнения STARTING NEW TASK. К ним относятся асинхронные (aRFC) и параллельные (pRFC) RFC вызовы. При асинхронном вызове, вызываемый модуль запускается в новом процессе и работает параллельно с основным рабочим процессом. Результат выполнения ФМ можно получить в функции обратной связи. Вызовы aRFC и pRFC выполняются в отдельных DB LUW.
  • Фоновые RFC – определяются с помощью дополнения IN BACKGROUND. К ним относятся транзакционные (tRFC), очередные (qRFC) и фоновые (bgRFC) RFC вызовы. ФМ работают независимо от основного процесса и начинают выполнение после команды COMMIT WORK. На все фоновые RFC создается один DB LUW. Результат фонового RFC нельзя передать в основной процесс.


Вызывать по RFC можно любой функциональный модуль, который объявлен как «дистанционный».
Дистанционный функциональный модуль RFC

Целевая система

Целевая система определяется с помощью DESTINATION dest, где dest — название RFC соединения. Для настройки RFC соединений используется транзакция SM59. Если в качестве dest передать пустую строку, то функция будет выполнена локально. В качестве dest можно передать ‘NONE’ или ‘BACK’.

  • DESTINATION ‘NONE’ — вызывает запуск функционального модуля в отдельном сеансе пользователя на том же сервере приложений, что и вызывающая программа.
  • DESTINATION ‘BACK’ — вызывает запуск функционального модуля в системе, из которой был функциональный модуль. Используется для этого обратного вызова в синхронных RFC.

Исключения

В RFC функциях, помимо запрограммированных исключений, можно обработать системные исключения:

  • COMMUNICATION_FAILURE – возникает когда связь с сервером не установлена либо когда соединение было прервано.
  • SYSTEM_FAILURE – возникает когда на удаленной системе возникла ошибка.

Примечание
Системные исключения COMMUNICATION_FAILURE и SYSTEM_FAILURE можно объявить с MESSAGE msg. Тогда, при наступлении исключения в msg вернется любое сообщение из целевой системы.

Синхронный RFC (sRFC)

При синхронном вызове RFC, рабочий процесс приостанавливает свою работу пока вызываемый модуль не завершит свою работу. Вызов выполняется в отдельном DB LUW. При вызове sRFC в основном процессе происходит неявный COMMIT. Поэтому вызовы sRFC не должны находиться между OpenSQL операторами, обновляющие БД.
При повторном вызове sRFC, глобальные данные группы функций вызываемого ФМ будут доступны до тех пор, пока не будет закрыто указанное соединение.
Если в sRFC вызывает CALL SCREEN, CALL TRANSACTION или отображение списка, то вызываемые экраны будут отображены в программе запустившей sRFC, но только если в настройках соединения разрешен диалоговый удаленный доступ, в противном случае возникнет исключение SYSTEM_FAILURE.

Пример ниже демонстрирует синхронный вызов RFC и обработку возможных видов исключений.

Результат
Пример вызова синхронного RFC

Аинхронный RFC (aRFC)

При асинхронном вызове RFC, вызываемый модуль запускается в новом процессе и работает параллельно с основным рабочим процессом. Вызов выполняется в отдельном DB LUW. Для запуска ФМ в асинхронном режиме необходимо вызвать ФМ с ключевыми словами STARTING NEW TASK <имя_задачи>.
Результат работы aRFC можно получить в функции обратного вызова, которая указывается с помощью ключевого слова PERFORMING <имя_процедуры> ON END OF TASK. При вызове aRFC из метода класса, функцией обратной связи может быть публичный метод, который определяется с помощью ключевого слова CALLING <имя_метода> ON END OF TASK. Указанные процедура или метод должны иметь один USING или IMPORTING параметр p_task типа clike, в который будет передаваться название задачи. Для получения данных из aRFC, внутри данной процедуры, используется обязательная команда RECEIVE RESULTS FROM FUNCTION <имя_функционального_модуля> c параметрами IMPORTING, TABLES, EXCEPTIONS которые будут переданы из aRFC.
Для ожидания выполнения aRFC вызовов используется команда WAIT UNTIL <условие>. Если условие выполняется, программа продолжит выполнение, если нет, то процесс будет ждать окончания выполнения следующего aRFC, пока условие не будет выполнено или не будут выполнены все aRFC вызовы.
В aRFC доступно системное исключение RESOURCE_FAILURE. Оно возникает если на сервере нет свободных ресурсов.

Пример ниже демонстрирует вызов нескольких aRFC и возврат результата в основной процесс. Функциональный модуль Z_TEST_RFC взят из примера sRFC.

Результат
Совокупный результат работы нескольких aRFC

Параллельный RFC (pRFC)

В ситуациях, когда требуется распараллелить выполнение пула однотипных операций, вместо aRFC рекомендуется использовать pRFC. Параллельный RFC работает схожим образом с aRFC и вызывается с помощью дополнения DESTINATION IN GROUP <имя_группы>. Группы pRFC настраиваются в RZ12. Если в качестве имени группы указать DEFAULT или SPACE, то вызов будет происходить на любой из определенных групп, в зависимости от их загруженности.
Для определения доступности ресурсов определенной группы можно воспользоваться ФМ SPBT_INITIALIZE.
Для определения сервера, на котором будет выполняться задача pRFC необходимо вызывать ФМ SPBT_GET_PP_DESTINATION сразу же после запуска pRFC.
Чтобы исключить конкретный сервер из дальнейшего использования для задач параллельной обработки (например, при исключении COMMUNICATION_FAILURE), необходимо использовать ФМ SPBT_DO_NOT_USE_SERVER.

Пример ниже демонстрирует параллельную обработку с учетом доступности ресурсов

Результат работы pRFC с учетом доступности ресурсов
Результат pRFC

Примечание
Если в pRFC вы используете алгоритм, требующий отдельной сессии (например пакетный ввод), то полагаться на исключение RESOURCE_FAILURE будет некорректно. Для определения максимального числа доступных процессов можно воспользоваться ФМ TH_USER_INFO.

SAP Help на тему параллельной обработки.

Транзакционный RFC (tRFC)

При запуски tRFC основной процесс продолжает работу. Запуск tRFC осуществляется с помощью дополнения IN BACKGROUND TASK. Выполнение tRFC начинается после вызова COMMIT WORK либо после вызова ФМ START_OF_BACKGROUNDTASK. Для всех tRFC создается один DB LUW аналогично модулям обновления, это дает возможным сделать ROLLBACK во всех tRFC если возникнет ошибка хотя бы в одном tRFC. В отличие от aRFC и pRFC, результат tRFC нельзя вернуть в программу через RECEIVE RESULTS FROM FUNCTION.
Использование дополнения AS SEPARATE UNIT функциональный модуль выполняется в отдельном контексте, в котором на глобальные данные группы функций не влияют предыдущие вызовы. Это означает, что при использовании одного и того же DESTINATION для нескольких вызовов tRFC, принадлежащих к одной и той же группе функций, глобальные данные этой группы функций доступны всем последующим tRFC.

Пример запуска tRFC

SAP Help на тему tRFC.

Очередный RFC (qRFC)

Очередный RFC — вариант tRFC, учитывающий порядок вызова модулей. В случае tRFC очередность выполнения модулей может не совпадать с порядком их вызовов. Для установки очередности необходимо перед каждым вызовом qRFC вызвать ФМ TRFC_SET_QUEUE_NAME с указанием имени очереди.

Пример ниже демонстрирует выполнение qRFC в том же порядке, в котором были вызваны модули

Фоновый RFC (bgRFC)

Фоновый RFC является технологией преемника tRFC и qRFC. SAP настоятельно рекомендует использовать bgRFC вместо tRFC и qRFC. Вызов bgRFC осуществляется с помощью дополнения IN BACKGROUND UNIT <oref>, где oref — ссылка на экземпляр класса, реализующий интерфейс IF_BGRFC_UNIT. Объект содержит всю информацию, требуемую для удаленного вызова функции, включая DESTINATION, тип вызова (tRFC или qRFC), количество очередей. Если один и тот же объект используется для нескольких вызовов, все вызываемые функциональные модули выполняются в одном модуле. И наоборот, несколько объектов этого типа могут использоваться параллельно в одном внутреннем сеансе, что обеспечивает параллельную обработку.
Примеры использования bgRFC можно найти в SAP через журнал использования по интерфейсу IF_BGRFC_UNIT.


Присоединиться к обсуждению...