ABAP Messaging Channels - метод связи между ABAP программами с помощью сообщений.
Каналы обмена сообщениями ABAP реализованы в виде объектов репозитория, к которым можно обращаться в программах отправителя и получателя с использованием интерфейса на основе классов (API). Классы и интерфейсы API используют соглашение об именах CL_AMC _... и IF_AMC _... соответственно.
Любой объект данных может быть отправлен путем сериализации в XML отправителем и десериализации получателем.
Длина сообщений, которые могут быть отправлены ограничена примерно 30000 байтами. Символьные строки преобразуются в формат UTF-8.
Каналы обмена сообщениями
Канал обмена сообщения должен существовать для каждой связи AMC. Ведение канала происходит в транзакции SAMC.
1 - Список каналов
2 и 3- настройки каждого канала
Message Type ID - Тип сообщения определяет тип данных объектов данных, которые могут быть отправлены как сообщения каналов сообщений. Типы TEXT для текстовых строк и BINARY для байтовых строк в настоящее время доступны.
Activity Scope - Область действия в которой можно отправлять и получать сообщения
System - Все программы всех пользовательских сессий в текущем сервере приложений ABAP могут получать сообщения.
Client - Все программы пользовательских сеансов в текущем AS ABAP, вошедшие в систему с тем же идентификатором клиента ( Трехсимвольный идентификатор , который посылается на сервер приложений ABAP при входе в систему),что и программа-отправитель, могут получать сообщения.
User - только программы сеансов вошедшие под тем же именем пользователя, что и программа отправитель, могут получать сообщения.
3 - Авторизованные программы. В данный блок прописывают программы для данного канала сообщений и их полномочия.
Send - программа которая отправляет сообщения AMC
Receive via session - программа получающая сообщения AMC
Receive via APC WebSocket - связывает соединение WebSocket с AMC. ( не использовал )
Любые нарушения правил, определенных этими свойствами для канала обмена сообщениями, приводят к возникновению исключений из класса CX_AMC_ERROR в программах отправителя и получателя.
Отправка сообщений AMC
Перед отправкой сообщения AMC в авторизованной программе необходимо использовать фабричный метод CREATE_MESSAGE_PRODUCER системного класса CL_AMC_CHANNEL_MANAGER , чтобы создать объект отправителя для канала обмена сообщениями из хранилища. Приложение и название канала передаются здесь. Возвращенная ссылочная переменная типа IF_AMC_MESSAGE_PRODUCER должна быть приведена к интерфейсу конкретного типа, содержащему метод SEND, используемый для отправки сообщений, соответствующих типу. Интерфейсы IF_AMC_MESSAGE_PRODUCER_TEXT и IF_AMC_MESSAGE_PRODUCER_BINARY, в зависимости от типа используемого канала обмена сообщениями.
Получение сообщений AMC
Прежде чем сообщение AMC может быть получено в авторизованной программе, необходимо использовать фабричный метод CREATE_MESSAGE_CONSUMER системного класса CL_AMC_CHANNEL_MANAGER , чтобы создать получателя для канала обмена сообщениями из хранилища. Приложение и название канала передаются здесь. Возвращенная ссылочная переменная имеет тип IF_AMC_MESSAGE_CONSUMER . У потребительских методов START_MESSAGE_DELIVERY и STOP_MESSAGE_DELIVERY есть две задачи:
Определение фазы приемника AMC - Метод START_MESSAGE_DELIVERY делает программу-получатель для канала обмена сообщениями потребителя готовой к приему сообщений. Метод STOP_MESSAGE_DELIVERY отменяет этот шаг. Сообщения, отправленные по каналу обмена сообщениями, принимаются только в том случае, если программа готова к приему.
Регистрация объектов получателя для сообщений канала сообщений -
Объекты-получатели являются экземплярами локальных или глобальных классов, которые реализуют по крайней мере один из специфических для типа интерфейсов IF_AMC_MESSAGE_RECEIVER_TEXT или IF_AMC_MESSAGE_RECEIVER_BINARY . Каждый из этих интерфейсов имеет метод RECEIVE, используемый в качестве процедуры обратного вызова для канала обмена сообщениями, для которого зарегистрирован объект-получатель. Входные параметры подпрограмм обратного вызова получают, соответствующие типу, сообщения, отправленные во время регистрации, и могут быть обработаны или переданы в методах.Когда объекты-получатели зарегистрированы, ссылки на них создаются в платформе AMC, чтобы поддерживать их работу. Также возможно отменить регистрацию объектов, используя метод STOP_MESSAGE_DELIVERY. Это удаляет ссылки. Объекты отменяются неявно в конце программы.
Как только один или несколько объектов-получателей были зарегистрированы, оператор WAIT FOR MESSAGING CHANNELS можно использовать для перевода программы в состояние ожидания, когда она готова к приему сообщений. Если во время ожидания программы сообщение получено по каналу обмена сообщениями, для которого зарегистрирован объект-получатель, выполняется соответствующий метод приема и выполняется проверка, чтобы определить, является ли логическое условие истинным или ложным. Состояние ожидания сохраняется до тех пор, пока условие ложно (но можно настроить максимальную продолжительность). Таким образом, можно использовать несколько сообщений до тех пор, пока не будет получено сообщение, которое завершает состояние ожидания.
- Методы START_MESSAGE_DELIVERY и STOP_MESSAGE_DELIVERY вызывают COMMIT WORK.
- Невозможно получать сообщения AMC во время процесса обновления (
CALL FUNCTION 'NAME_FUNCTION' IN UPDATE TASK ) .
Пример( Настрой канала на скриншоте выше )
Программа отправитель:
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 |
REPORT Z_DEMO_AMC_PAY. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS send. ENDCLASS. CLASS demo IMPLEMENTATION. METHOD send. DATA(json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). CALL TRANSFORMATION id SOURCE message = `Привет из другой программы` RESULT XML json_writer. DATA(json) = json_writer->get_output( ). TRY. CAST if_amc_message_producer_binary( cl_amc_channel_manager=>create_message_producer( i_application_id = 'Z_DEMO_PAY' i_channel_id = '/demo_pay' ) )->send( i_message = json ). CATCH cx_amc_error INTO DATA(binary_exc). cl_demo_output=>display( binary_exc->get_text( ) ). ENDTRY. ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>send( ). |
Программа получатель:
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 |
REPORT Z_DEMO_AMC_PAY_RECEIVE. CLASS message_receiver DEFINITION. PUBLIC SECTION. INTERFACES: if_amc_message_receiver_binary. DATA: binary_message TYPE xstring. ENDCLASS. CLASS message_receiver IMPLEMENTATION. METHOD if_amc_message_receiver_binary~receive. binary_message = i_message. ENDMETHOD. ENDCLASS. CLASS amc_demo DEFINITION. PUBLIC SECTION. CLASS-METHODS reception. ENDCLASS. CLASS amc_demo IMPLEMENTATION. METHOD reception. DATA(receiver) = NEW message_receiver( ). TRY. cl_amc_channel_manager=>create_message_consumer( i_application_id = 'Z_DEMO_PAY' i_channel_id = '/demo_pay' )->start_message_delivery( i_receiver = receiver ). CATCH cx_amc_error INTO DATA(binary_exc). cl_demo_output=>display( binary_exc->get_text( ) ). ENDTRY. WAIT FOR MESSAGING CHANNELS UNTIL receiver->binary_message IS NOT INITIAL UP TO 60 SECONDS. cl_demo_output=>display_json( receiver->binary_message ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. amc_demo=>reception( ). |
Для проверки запустим программу получатель, она войдет в режим ожидания, во время которого выполним программу отправитель. в результате получим такое окно: