1.26 ABAP Channels: ABAP Messaging Channels

Programs之间可以通过共享内存分享信息,但是相同系统,不同Application Server之间不能通信;

ABAP Messaging Channels (AMC)提供跨Application通信,结合ABAP Push Channels (APC),可以和外部网络通信,例如:SAP UI5;

Tcode: AMC_LOG_ADMIN,打开Logging;

Tcode: AMC_LOG_PROCESSING,Logging监视器;

Tcode: SMAMC,AMC recipient;

创建AMC方式:

1.使用Tcode:SAMC,可以打开AMC Workbench;

2.使用Tcode:SE80,选择Package->右键Create->Connectivity->ABAP Messaging Channel Applications;

创建一个AMC,通过Application,Channel name区分;

Channel Name:需要/开头,大小写敏感;

Message Type:定义发送Message类型;

TEXT,ABAP类型STRING

Producer interface: IF_AMC_MESSAGE_PRODUCER_TEXT

Receiver interface: IF_AMC_MESSAGE_RECEIVER_TEXT

BINARY,ABAP类型XSTRING

Producer interface: IF_AMC_MESSAGE_PRODUCER_BINARY

Receiver interface: IF_AMC_MESSAGE_RECEIVER_BINARY

PCP, Push Channel Protocol

Corresponding ABAP interface:IF_AC_MESSAGE_TYPE_PCP

Producer interface: IF_AMC_MESSAGE_PRODUCER_PCP

Receiver interface: IF_AMC_MESSAGE_RECEIVER_PCP

定义PCP类型:CL_AC_MESSAGE_TYPE_PCP=>CREATE( );

Scope:定义可以接收Message范围,System,Client,User;

Tcode:SM02,可以看到System中message;

Authorized programs:定义可以接收或发送信息的Program;

Program可以是Reports,Function,Classes;

定义Program: ZTOM_AMC_RECEIVE_TEXT,接收message;

示例代码:

REPORT ZTOM_AMC_RECEIVE_TEXT.

DATA:gt_message_text TYPE TABLE OF string.
SELECTION-SCREEN BEGIN OF BLOCK blk1.
  PARAMETERS:p_sec TYPE i. "等待时间
  PARAMETERS:p_msgn TYPE i. "message条数
SELECTION-SCREEN END OF BLOCK blk1.

CLASS zcl_amc_receive_text DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_amc_message_receiver_text.
ENDCLASS.

CLASS zcl_amc_receive_text IMPLEMENTATION.
  "实现receive方法
  METHOD:if_amc_message_receiver_text~receive.
    APPEND i_message TO gt_message_text.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  PERFORM f_get_amc_text.

"获取amc text
FORM f_get_amc_text.
  DATA:lo_consumer TYPE REF TO if_amc_message_consumer.
  DATA:lo_text_receiver TYPE REF TO zcl_amc_receive_text.

TRY .
    "创建msg消费者
    lo_consumer = cl_amc_channel_manager=>create_message_consumer(
      i_application_id = 'ZT_AMC1'
      i_channel_id = '/test'
    ).
    lo_text_receiver = NEW #( ).
    "start message delivery
    lo_consumer->start_message_delivery(
      i_receiver = lo_text_receiver
    ).
    "等待message
    WAIT FOR MESSAGING CHANNELS UNTIL
    lines( gt_message_text ) >= p_msgn UP TO p_sec SECONDS.

"写出接收message
    LOOP AT gt_message_text INTO DATA(gs_message_text).
      WRITE:/ gs_message_text.
    ENDLOOP.
  CATCH cx_root INTO DATA(lo_exception).
    WRITE:/ lo_exception->get_text( ).
  ENDTRY.
ENDFORM.

定义Program:ZTOM_AMC_SEND_TEXT,发送message;

示例代码:

REPORT ZTOM_AMC_SEND_TEXT.

SELECTION-SCREEN BEGIN OF BLOCK blk1.
  PARAMETERS:p_msg TYPE string LOWER CASE. "message
SELECTION-SCREEN END OF BLOCK blk1.

AT SELECTION-SCREEN.
  PERFORM f_send_amc_text.

"发送amc text
FORM f_send_amc_text.
  DATA:lo_producer TYPE REF TO if_amc_message_producer_text.
  TRY.
    "创建msg消费者
    lo_producer ?= cl_amc_channel_manager=>create_message_producer(
      i_application_id = 'ZT_AMC1'
      i_channel_id = '/test'
    ).
    lo_producer->send( i_message = p_msg ).
  CATCH cx_root INTO DATA(lo_exception).
    WRITE:/ lo_exception->get_text( ).
  ENDTRY.
ENDFORM.

示例Package:SABAPDEMOS,Application:DEMO_AMC;

示例代码: CL_AMC_CHANNEL_MANAGER,AMC Channel管理类,message生产者;

FORM f_amc_send_message.
  DATA:lo_producer TYPE REF TO if_amc_message_producer_text.
  TRY.
    lo_producer ?= cl_amc_channel_manager=>create_message_producer(
      i_application_id = 'DEMO_AMC'
      i_channel_id = '/demo_text'
    ).
    lo_producer->send( 'test message' ).
  CATCH cx_root INTO DATA(lo_exception).
    WRITE:/ lo_exception->get_text( ).
  ENDTRY.
ENDFORM.

获取Message Consumer,可以自定义类,通过实现接口IF_AMC_MESSAGE_RECEIVER_<message_type>,定义receiver;

示例代码:

"message consumer
FORM f_amc_get_message.
  DATA:lo_consumer TYPE REF TO if_amc_message_consumer.
  TRY.
    lo_consumer = cl_amc_channel_manager=>create_message_consumer(
        i_application_id = 'DEMO_AMC'
        i_channel_id = '/demo_text'
    ).
  CATCH cx_root INTO DATA(lo_exception).
    WRITE:/ lo_exception->get_text( ).
  ENDTRY.
ENDFORM.

示例代码:Receiver类定义

"AMC reveiver类定义
CLASS zcl_receiver DEFINITION.
  PUBLIC SECTION.
    INTERFACES: if_amc_message_receiver_text.
    EVENTS message_received EXPORTING VALUE(ev_message) TYPE string.
ENDCLASS.

CLASS zcl_receiver IMPLEMENTATION.
  METHOD:if_amc_message_receiver_text~receive.
    RAISE EVENT message_received EXPORTING ev_message = i_message.
  ENDMETHOD.
ENDCLASS.

"使用receiver
FORM f_amc_receiver.
  DATA:lo_receiver TYPE REF TO zcl_receiver.
  DATA:lo_consumer TYPE REF TO if_amc_message_consumer.
  TRY.
    lo_consumer = cl_amc_channel_manager=>create_message_consumer(
        i_application_id = 'DEMO_AMC'
        i_channel_id = '/demo_text'
    ).
    "CREATE OBJECT lo_receiver.
    lo_receiver = NEW #( ).
    lo_consumer->start_message_delivery( lo_receiver ).
  CATCH cx_root INTO DATA(lo_exception).
    WRITE:/ lo_exception->get_text( ).
  ENDTRY.
ENDFORM.

示例代码:等待AMC信息;

"wait 语句
FORM f_amc_wait.
  "WAIT FOR MESSAGING CHANNELS UNTIL <condition> UP TO <n> SECONDS.
ENDFORM.

1.27 ABAP Channels: ABAP Push Channels

A Web Service can push data to ABAP Program;

ABAP Program Push Message to a web page;

使用Tcode:SAPC,可以打开APC Workbench;

右键->Create->输入Application名称;

Class Name:ZCL_APC_WSP_EXT_ZT_APC1;

点击Generate Class and Service;

Connection Type:可以设置链接类型,WebSocket或者TCP Socket;

Protocol:可以设置协议;

选择重写ON_START方法,ON_MESSAGE方法;

示例代码:

method IF_APC_WSP_EXTENSION~ON_START.
*CALL METHOD SUPER->IF_APC_WSP_EXTENSION~ON_START
*  EXPORTING
*    I_CONTEXT         =
*    I_MESSAGE_MANAGER =
*    .
    TRY.
        " send the message on websocket connection
        DATA(lo_message) = i_message_manager->create_message( ).
        lo_message->set_text( |{ sy-mandt }/{ sy-uname }: ON_START has been successfully executed !| ).
        i_message_manager->send( lo_message ).
    CATCH cx_apc_error INTO DATA(lx_apc_error).
        MESSAGE lx_apc_error->get_text( ) TYPE 'E'.
    ENDTRY.
  endmethod.

示例代码:

method IF_APC_WSP_EXTENSION~ON_MESSAGE.
*CALL METHOD SUPER->IF_APC_WSP_EXTENSION~ON_MESSAGE
*  EXPORTING
*    I_MESSAGE         =
*    I_MESSAGE_MANAGER =
*    I_CONTEXT         =
*    .
    TRY.
        " retrieve the text message
        DATA(lv_text) = i_message->get_text( ).
        " create the message manager and message object
        DATA(lo_message) = i_message_manager->create_message( ).
        " send 1st message
        lo_message->set_text( |{ sy-mandt }/{ sy-uname }: ON_MESSAGE has been successfully executed !| ).
        i_message_manager->send( lo_message ).

" send 2nd message, i.e. echo the incoming message
        lo_message->set_text( lv_text ).
        i_message_manager->send( lo_message ).
      CATCH cx_apc_error INTO DATA(lx_apc_error).
        MESSAGE lx_apc_error->get_text( ) TYPE 'E'.
    ENDTRY.
  endmethod.

保存Class激活后,点击执行;

弹出Web页面;

WDA Component:WDR_TEST_APC_WSP

如何AMC和APC一起使用,实现Web发送信息给ABAP Program,ABAP Program发送信息给Web?

1.修改APC中的on_start,on_message方法;

示例代码:on_start

TRY.
      "start时绑定为消费者,接收ABAP program message
      DATA(lo_binding) = i_context->get_binding_manager( ).
      lo_binding->bind_amc_message_consumer(
        i_application_id = 'ZT_AMC1'
        i_channel_id = '/test'
      ).
    CATCH cx_apc_error INTO DATA(lo_exception).
      MESSAGE lo_exception->get_text( ) TYPE 'E'.
    ENDTRY.

示例代码:on_message

"案例2
    "作为producer,生成messageABAP program
    TRY .
      DATA:lo_producer TYPE REF TO if_amc_message_producer_text.
      DATA(lv_text) = i_message->get_text( ).
      lo_producer ?= cl_amc_channel_manager=>create_message_producer(
        i_application_id = 'ZT_AMC1'
        i_channel_id = '/test'
      ).
      lo_producer->send( i_message = lv_text ).
    CATCH cx_amc_error INTO DATA(lo_amc_exception).
      MESSAGE lo_amc_exception->get_text( ) TYPE 'E'.
    CATCH cx_apc_error INTO DATA(lo_apc_exception).
      MESSAGE lo_apc_exception->get_text( ) TYPE 'E'.
    ENDTRY.

2.将APC对应Class,维护为AMC的Authorized Program;

3.执行测试APC

通过Web发送信息,然后Program: ZTOM_AMC_RECEIVE_TEXT接收信息;

通过Program: ZTOM_AMC_SEND_TEXT发送信息,Web接收信息;

参考Blog:

https://blogs.sap.com/2015/09/07/abap-push-channel-messaging-channel-and-sapui5-demo-application/

S4HANA For ABAP(6):ABAP Channels相关推荐

  1. SAP ABAP DDICSAP ABAP DDIC table runtime object table runtime object

    Created by Jerry Wang, last modified on Dec 30, 2014 如何显示DDIC table的runtime object: field PRODUCT_TY ...

  2. Jerry的ABAP原创技术文章合集

    我之前发过三篇和ABAP相关的文章: 1. Jerry的ABAP, Java和JavaScript乱炖 这篇文章包含我多年来在SAP成都研究院使用ABAP, Java和JavaScript工作过程中的 ...

  3. ABAP编程语言-概览

    ABAP  编程- 概览 ABAP 是SAP为SAP商业应用开发而设计的一种编程语言,其对象组件使面向对象编程成为可能 ABAP on AS ABAP实例 在SAP系统中,ABAP 是 Applica ...

  4. Notepad++中高亮显示ABAP代码方法

    把以下代码保存为ABAP.XML <NotepadPlus> <UserLang name="ABAP" ext="abap"> < ...

  5. ABAP OO的八大理由

    1.        ABAP OO更加明确所以更易于使用.例如在使用ABAPOO你的程序的执行流程不再是由运行时隐含的控制.这样你就可以自己去设计程序所执行的流程了而不必像面向过程那样去了解和服从外部 ...

  6. ABAP程序中的七大危险漏洞

    概述 SAP的企业资源规划(ERP)系统已成为企业各项关键业务:财务管理.薪资管理.人力资源管理.供应链管理.客户关系管理等的基础平台.然而,在每个SAP的安装实施过程中,都会基于客户的需求进行不同程 ...

  7. ABAP,Java和JavaScript的序列化,反序列化

    ABAP 1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_xstring和xml_xstring_to_abap实现两种格式的互换. ...

  8. ABAP 代码中,哪些特殊字符不能用于变量命名?

    下列 ABAP 代码,哪些行会引起编译错误? REPORT z.TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.DATA(lt*) = VALUE t_itab ...

  9. 现代 ABAP 编程语言中的正则表达式

    在这篇博文中,我想分享现代 ABAP 中正则表达式的最新消息和变化,主要来自 OP 版本 7.55 和 7.56. 以前,在 ABAP 中使用 POSIX 样式的正则表达式或"uniX 的便 ...

最新文章

  1. Redis启动服务器端和客户端的命令(redis-server、redis-cli、--help、kill、ping、切换数据库)
  2. git clone 代码下载速度慢的解决方法
  3. shell中变量的替换
  4. CUDA和cuDNN到底是啥关系?(cuDNN是基于CUDA的深度学习GPU加速库)
  5. MATLAB语言算法实验报告,机械工程实验——matlab实验报告.doc
  6. onclick 源码_仿照React源码流程打造90行代码的Hooks
  7. Java 类型转换String,List,Map,Array
  8. 常见光纤收发器组网方式介绍
  9. python成员运算符包括_Python 使用成员运算符案例
  10. Spring Boot笔记-自定义配置项默认值设置
  11. html引入vue不兼容ie11,关于vue.js:iview按需引入ie11不兼容报无效字符问题解决
  12. matlab图片白边_Matlab论文插图消除白边的5种方法
  13. python编辑器中文字体倒立的_如何用Python+人工识别处理知乎的倒立汉字验证码...
  14. 华为p40为何没有搭载鸿蒙系统?
  15. eclipse 工具翻译插件安装
  16. linux命令(3) 链接ln和搜索locate,find, whereis, which, grep命令
  17. 把edge默认上网页面改为百度
  18. Android开发之黑科技安装APP无启动图标
  19. Python程序员爬出百套美女写真集,同样是爬虫,他为何如此突出?
  20. TPTP—详细说明讲解

热门文章

  1. 个人职业论述报告-java程序员
  2. 2022年湖南大学计算机考研复试分数线高吗
  3. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】
  4. Python压缩解压zip,Django下载zip文件
  5. 继富士康之后,又一个8万人大厂转移印度,但仍在中国留有后路
  6. Mysql8.0新特性之详细版本
  7. 修改eclipse对jsp文件sorce format长度
  8. KR|腰围60cm,舞王式看不出肋骨外翻
  9. T型电阻网络噪声分析
  10. 路径规划仿真平台1.1 MSA*算法