SAP資格過去問ならSAPnavi

NoteやStripe決済で安全にSAP過去問を購入することができます。
領収書発行可能 / 即時入手可能

SAP過去問 (SAP Exam)

Sending AMC Messages

ローカルまたはグローバルクラスから送信者オブジェクトを登録することにより、ABAPプログラムがメッセージをABAPメッセージングチャネル(AMC)に公開できるようにすることができます。

送信者オブジェクトの作成

関連付けられたプロデューサーインターフェイスを使用して送信者オブジェクトを作成する

ABAPプログラムがAMCでメッセージを公開できるようにするには、ファクトリメソッドCL_AMC_CLINET_MANAGER=>CREATE_MESSAGE_PRODUCERを使用して送信者オブジェクトを作成する必要があります

メソッドのパラメーターは次のとおりです。

  • I_APPLICATION_ID:メッセージングチャネルのコンテナとして使用されるABAPメッセージングチャネルアプリケーションのIDを参照します。

  • I_CHANNEL_ID:メッセージのディスパッチに使用する必要があるメッセージングチャネルを定義します。

  • I_CHANNEL_EXTENSION_ID(オプション):チャネル拡張IDは実行時に作成され、特定のオブジェクトのみがAMCメッセージを公開できるようにします。同じチャネル拡張IDを指定したレシーバーオブジェクトのみがこれらのメッセージを受信します。

  • I_SUPRESS_ECHO(オプション):送信者オブジェクトが自分のメッセージを受信しないようにします。

  • I_CHANNEL_FILTER(オプション):フィルター要素を定義することにより、受信するメッセージをフィルター処理できます。プロデューサーのフィルター値がコンシューマーのフィルター基準に一致する場合にのみ、メッセージが配信されます。

CREATE_MESSAGE_PRODUCERメソッドは、インターフェイスIF_AMC_MESSAGE_PRODUCER参照変数として返します。次に、変数は次のタイプ固有のインターフェースの1つにキャストされます。

  • IF_AMC_MESSAGE_PRODUCER_TEXT

  • IF_AMC_MESSAGE_PRODUCER_BINARY

  • IF_AMC_MESSAGE_PRODUCER_PCP

すべてのタイプ固有のインターフェースには、専用のメッセージタイプのメッセージを送信できるメソッドSENDが含まれています。これは、現在テキスト文字列、バイト文字列としてのJSONデータ、2つの名前と値のペア、およびSAP固有のプッシュチャネルの本文です。プロトコル(PCP)。PCPメッセージのデータは、クラスCL_AC_MESSAGE_TYPE_PCPのオブジェクトに渡され、そこでシリアル化されます。

プログラミング例

サンプルプログラムdemo_send_amcでは、パッケージSABAPDEMOSのAMCアプリケーションDEMO_AMCのメッセージングチャネル/ demo_text/ demo_binary、および/demo_pcpに対して送信者オブジェクトが作成されます

REPORT demo_send_amc.CLASS demo DEFINITION.  PUBLIC SECTION.    CLASS-METHODS main.ENDCLASS.CLASS demo IMPLEMENTATION.  METHOD main.    TYPES:      BEGIN OF struct,        name  TYPE string,        value TYPE string,      END OF struct,      fields TYPE STANDARD TABLE OF struct WITH EMPTY KEY.    DATA: text TYPE abap_bool,          hex  TYPE abap_bool,          pcp  TYPE abap_bool.    DATA text_message   TYPE string VALUE `I am a text message`.    DATA binary_message TYPE string VALUE `I am a binary message`.    DATA pcp_body       TYPE string VALUE `I am a PCP body`.    DATA field1         TYPE string VALUE `Field1`.    DATA value1         TYPE string VALUE `Value1`.    DATA field2         TYPE string VALUE `Field2`.    DATA value2         TYPE string VALUE `Value2`.    DATA no_echo        TYPE abap_bool.    DATA session_id     TYPE amc_consumer_session_id.    cl_demo_input=>new(      )->add_field( EXPORTING text = 'Text message'                    CHANGING  field = text_message      )->add_field( EXPORTING text = 'Send text message'                              as_checkbox = 'X'                    CHANGING  field = text      )->add_line(      )->add_field( EXPORTING text = 'Binary message'                    CHANGING  field = binary_message      )->add_field( EXPORTING text = 'Send binary message'                              as_checkbox = 'X'                    CHANGING  field = hex      )->add_line(      )->add_field( EXPORTING text = 'Field1' CHANGING field = value1      )->add_field( EXPORTING text = 'Field2' CHANGING field = value2      )->add_field( EXPORTING text = 'PCP body'                    CHANGING  field = pcp_body      )->add_field( EXPORTING text = 'Send PCP message'                              as_checkbox = 'X'                    CHANGING  field = pcp      )->add_line(      )->add_field( EXPORTING text = 'Suppress echo'                              as_checkbox = 'X'                    CHANGING  field = no_echo      )->add_line(      )->add_field( EXPORTING text  = 'Consumer session id'                    CHANGING  field = session_id      )->request( ).    IF text IS NOT INITIAL.      TRY.          IF session_id IS INITIAL.            CAST if_amc_message_producer_text(                   cl_amc_channel_manager=>create_message_producer(                     i_application_id = 'DEMO_AMC'                     i_channel_id     = '/demo_text'                     i_suppress_echo  = no_echo )              )->send( i_message = text_message ).          ELSE.            CAST if_amc_message_producer_text(                 cl_amc_channel_manager=>create_message_producer_by_id(                   i_consumer_session_id = session_id                   i_communication_type  =                       cl_amc_channel_manager=>co_comm_type_synchronous                   i_application_id      = 'DEMO_AMC'                   i_channel_id          = '/demo_text' )              )->send( i_message = text_message ).          ENDIF.        CATCH cx_amc_error INTO DATA(text_exc).          cl_demo_output=>display( text_exc->get_text( ) ).      ENDTRY.    ENDIF.    IF hex IS NOT INITIAL.      DATA(json_writer) = cl_sxml_string_writer=>create(                          type = if_sxml=>co_xt_json ).      CALL TRANSFORMATION id SOURCE message = binary_message                             RESULT XML json_writer.      DATA(json) = json_writer->get_output( ).      TRY.          IF session_id IS INITIAL.            CAST if_amc_message_producer_binary(                   cl_amc_channel_manager=>create_message_producer(                     i_application_id = 'DEMO_AMC'                     i_channel_id     = '/demo_binary'                     i_suppress_echo  = no_echo )              )->send( i_message = json ).          ELSE.            CAST if_amc_message_producer_binary(                 cl_amc_channel_manager=>create_message_producer_by_id(                   i_consumer_session_id = session_id                   i_communication_type  =                       cl_amc_channel_manager=>co_comm_type_synchronous                   i_application_id = 'DEMO_AMC'                   i_channel_id     = '/demo_binary' )              )->send( i_message = json ).          ENDIF.        CATCH cx_amc_error INTO DATA(binary_exc).          cl_demo_output=>display( binary_exc->get_text( ) ).      ENDTRY.    ENDIF.    IF pcp IS NOT INITIAL.      DATA(fields) = VALUE fields( ( name = 'Field1' value = value1 )                                   ( name = 'Field2' value = value2 ) ).      DATA(body)  = |<b>{ pcp_body }</b>|.      TRY.          DATA(pcp_message) = cl_ac_message_type_pcp=>create( ).          pcp_message->set_field( i_name  = fields[ 1 ]-name                             i_value = fields[ 1 ]-value ).          pcp_message->set_field( i_name  = fields[ 2 ]-name                             i_value = fields[ 2 ]-value ).          pcp_message->set_text( body ).          IF session_id IS INITIAL.            CAST if_amc_message_producer_pcp(                  cl_amc_channel_manager=>create_message_producer(                    i_application_id = 'DEMO_AMC'                    i_channel_id     = '/demo_pcp'                    i_suppress_echo  = no_echo )              )->send( i_message = pcp_message ).          ELSE.            CAST if_amc_message_producer_pcp(                 cl_amc_channel_manager=>create_message_producer_by_id(                   i_consumer_session_id = session_id                   i_communication_type  =                       cl_amc_channel_manager=>co_comm_type_synchronous                   i_application_id = 'DEMO_AMC'                   i_channel_id     = '/demo_pcp' )              )->send( i_message = pcp_message ).          ENDIF.        CATCH cx_amc_error INTO DATA(amc_exc).          cl_demo_output=>display( amc_exc->get_text( ) ).        CATCH cx_ac_message_type_pcp_error INTO DATA(pcp_exc).          cl_demo_output=>display( pcp_exc->get_text( ) ).      ENDTRY.    ENDIF.  ENDMETHOD.ENDCLASS.START-OF-SELECTION.  demo=>main( ).

AMCとAPCWebSocket間のコラボレーション

ABAPプッシュチャネル(APC)WebSocket接続をABAPメッセージングチャネルにバインドして、複数のWebアプリケーション(Webブラウザで実行)がAMCを介してプッシュメッセージを交換できるようにすることができます。これらの協調的なAPC/AMCシナリオでは、ブラウザーはWebSocketプロトコルをサポートする必要があります。

詳細については、APC/AMCコラボレーションの有効化のサンプルプログラムdemo_apc_wspを参照してください

独自のAMCメッセージの受信を抑制します

多くの場合、AMCメッセージの送信者オブジェクトは、独自のメッセージの送信に使用するのと同じチャネルでのメッセージ受信もサブスクライブしています。ただし、メッセージが送信者オブジェクトを除くすべての受信者オブジェクトにディスパッチされることをお勧めします。

このためには、 I_SUPRESS_ECHOパラメーターをに設定する必要がありますABAP_TRUEこの送信者オブジェクトを介して送信されたメッセージは、独自のABAPセッションまたは独自のバインドされたWebSocket接続にディスパッチされません。

より正確には、メッセージ受信者は次の場合に除外されます。

  • これは登録済みのABAPセッションであり、メッセージを送信するセッションと一致します。
  • これはバインドされたAPC(WebSocket)接続であり、APC接続は送信側ABAPセッションに属します。

後者の場合、suppress_echoオプションを使用すると、ABAPセッションは、自身のAPCアプリケーションのフロントエンドを除くすべてのサブスクライブされたアプリケーションクライアントのフロントエンドにAMCメッセージを送信できます。I_SUPRESS_ECHOパラメータのデフォルト値はですABAP_FALSE。これは、サブスクライブされたすべての受信者にメッセージがディスパッチされることを意味します。

タイトルとURLをコピーしました