使用 Google Cloud 適用的 ABAP SDK 將事件發布至 Cloud Pub/Sub

1. 簡介

在本程式碼研究室中,我們列出了使用 ABAP for Google Cloud SDK 將事件發布至 Google Cloud Pub/Sub API 的步驟。

本程式碼研究室會使用下列 Google Cloud 服務:

  • Pub/Sub
  • Cloud Shell

建構項目

您將學習下列內容:

  • 在 Google Cloud 專案中啟用 Pub/Sub。
  • 建立 Pub/Sub 主題。
  • 發布訊息。

2. 事前準備

6757b2fb50ddcc2d.png

  • 執行下列指令,即可驗證帳戶,並將預設專案設為 abap-sdk-poc。以區域 us-west4-b 為例。如有需要,請根據偏好變更下列指令中的專案和區域。
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

3. 總覽

本程式碼研究室的範圍涵蓋 Pub/Sub 服務的下列元件:

  • 發布者 (又稱為生產者):建立訊息,並將訊息傳送 (發布) 至指定主題的通訊服務。
  • 訊息:透過訊息服務傳送的資料。
  • 主題:一種具名實體,代表訊息來源。

4f5676da8922467f.png

4. 設定 Pub/Sub 服務

  1. 如要建立具有必要角色的服務帳戶,請在 Cloud Shell 終端機中執行下列指令:
gcloud iam service-accounts create abap-sdk-pubsub-tester --display-name="Service Account for PubSub"
  1. 如要為服務帳戶 (abap-sdk-poc) 啟用 Pub/Sub API,請在 Cloud Shell 終端機中執行下列指令:
gcloud services enable pubsub.googleapis.com
  1. 將 IAM 角色 pubsub.topics.create 授予服務帳戶,以便建立主題。在 Cloud Shell 終端機中執行下列指令:
gcloud endpoints services add-iam-policy-binding pubsub.googleapis.com \ --member='serviceAccount:abap-sdk-pubusb-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/roles/pubsub.topics.create'
  1. 將 IAM 角色 pubsub.topics.publish 授予服務帳戶,以便將訊息發布至主題。在 Cloud Shell 終端機中執行下列指令:
gcloud endpoints services add-iam-policy-binding pubsub.googleapis.com \ --member='serviceAccount:abap-sdk-pubusb-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/roles/pubsub.topics.publish'
  1. 如要確認是否已新增角色,請前往 IAM 頁面。您建立的服務帳戶應會列出已指派給該帳戶的角色。

5. 設定用戶端金鑰

如要維護 /GOOG/CLIENT_KEY 資料表中的設定,請執行下列步驟:

  1. 在 SAP GUI 中輸入交易代碼 SPRO
  2. 按一下「SAP Reference IMG」
  3. 依序點選「ABAP SDK for Google Cloud」>「基本設定」>「設定用戶端金鑰」
  4. 按一下「新增項目」
  5. 請輸入下列欄位的值:

欄位

說明

Google Cloud 金鑰名稱

PUBSUB_DEMO

Google Cloud 服務帳戶名稱

abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud 範圍

https://www.googleapis.com/auth/cloud-platform

Google Cloud 專案 ID

abap-sdk-poc

授權類別

/GOOG/CL_AUTH_GOOGLE

將其他欄位留空

ec6b6f94bfa85533.png

6. 建立主題

您可以使用 API 暫存檔 /GOOG/CL_PUBSUB_V1 的 CREATE_TOPICS 方法建立主題。方法的簽名:

d40fde108ccf2853.png

  1. 在 SAP GUI 中輸入交易代碼 SE38
  2. 建立名稱為 ZPUBSUB_DEMO 的報表。
  3. 在隨即開啟的彈出式視窗中,提供下列詳細資料,然後按一下「儲存」

f9cbdabb6ca96fc4.png

  1. 在下一個彈出式視窗中,選取「Local Object」或提供適當的套件名稱。
  2. 在 ABAP 編輯器中新增下列程式碼:
" Data Declaration
DATA:
  lo_client        TYPE REF TO /goog/cl_pubsub_v1.

TRY.
    " Open HTTP Connection
    CREATE OBJECT lo_client EXPORTING iv_key_name = 'PUBSUB_DEMO'.

    " Populate relevant parameters
    DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).
    DATA(lv_p_topics_id) = CONV string( 'PUBSUB_DEMO_TOPIC' ).

    " Call API method pubsub.topics.create
    lo_client->create_topics(
      EXPORTING
        iv_p_projects_id = lv_p_projects_id
        iv_p_topics_id   = lv_p_topics_id
      IMPORTING
      es_output        = DATA(ls_output)
      ev_ret_code      = DATA(lv_ret_code)
      ev_err_text      = DATA(lv_err_text)
      es_err_resp      = DATA(ls_err_resp) ).

    IF lo_client->is_success( lv_ret_code ) = abap_true.
      DATA(lv_msg) = 'Topic ' && ':' && lv_p_topics_id && ' was created!'.
      MESSAGE lv_msg TYPE 'I' .
    ELSE.
      MESSAGE lv_err_text TYPE 'E'.
    ENDIF.

    " Close HTTP Connection
    lo_client->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    MESSAGE lo_exception->get_text( ) TYPE 'E'.
    RETURN.
ENDTRY.
  1. 儲存並啟用報表。
  2. 執行報表 (F8)。

執行成功後,您應該會看到下列報表輸出內容:

16aa8a4c59d776d9.png

7. 將訊息發布至主題

主題準備就緒後,我們可以專注於傳送資料。接下來,我們將說明如何發布這個主題的訊息。訊息會使用 API 輔助程式 /GOOG/CL_PUBSUB_V1PUBLISH_TOPICS 方法發布至主題。

方法的簽名:

459fe21ce68bd811.png

  1. 在 SAP GUI 中輸入交易代碼 SE38
  2. 建立名稱為 ZPUBSUB_DEMO_PUBLISH 的報表。
  3. 在隨即開啟的彈出式視窗中,提供下列詳細資料,然後按一下「儲存」

9a180c4e9a1e139.png

  1. 在下一個彈出式視窗中,選取「Local Object」或提供適當的套件名稱。
  2. 在 ABAP 編輯器中新增下列程式碼:
" Data Declaration
DATA:
  lo_client        TYPE REF TO /goog/cl_pubsub_v1,
  ls_message       TYPE /goog/cl_pubsub_v1=>ty_025,
  ls_input         TYPE /goog/cl_pubsub_v1=>ty_023.

TRY.
    " Open HTTP Connection
    CREATE OBJECT lo_client EXPORTING iv_key_name = 'PUBSUB_DEMO'.

    " Populate relevant parameters
    DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).
    DATA(lv_p_topics_id) = CONV string( 'PUBSUB_DEMO_TOPIC' ).

    ls_message-data = cl_http_utility=>encode_base64( unencoded = ' This message was published to topic' ).
    APPEND ls_message TO ls_input-messages.

    " Call API method : pubsub.topics.publish
    " This method publishes the message(encoded in base64 format to the topic )
    lo_client->publish_topics(
     EXPORTING
       iv_p_projects_id = lv_p_projects_id
       iv_p_topics_id   = lv_p_topics_id
       is_input         = ls_input
     IMPORTING
       es_output        = DATA(ls_output)
       ev_ret_code      = DATA(lv_ret_code)
       ev_err_text      = DATA(lv_err_text)
       es_err_resp      = DATA(ls_err_resp)  ).

    IF lo_client->is_success( lv_ret_code ) = abap_true.
       DATA(lv_msg) = 'Message was published to topic '  && ': ' &&         lv_p_topics_id.
      MESSAGE lv_msg TYPE 'I' DISPLAY LIKE 'S'.

    ELSE.
      MESSAGE lv_err_text TYPE 'E'.
    ENDIF.

    " Close HTTP Connection
    lo_client->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    MESSAGE lv_err_text TYPE 'E'.
    RETURN.
ENDTRY.
  1. 儲存並啟用報表。
  2. 執行報表 (F8)。

執行成功後,您應該會看到下列報表輸出內容:

384125235efc104.png

8. 恭喜

恭喜!您已使用 ABAP SDK for Google Cloud,成功將訊息發布至 Google Cloud Platform 的 Pub/Sub API。

您現在可以繼續進行下列程式碼研究室,繼續學習如何使用 ABAP SDK 存取各種 Google Cloud 服務。

  • 接收 Cloud Pub/Sub 傳送的事件
  • 使用分割功能將檔案上傳至 Cloud Storage 值區
  • 從 ABAP 呼叫 Vertex AI test-bison
  • . . 。

9. 清理

如果您不想繼續進行與 Google Cloud 適用的 ABAP SDK 相關的其他程式碼研究室,請繼續進行清理作業。

刪除專案

  • 刪除 Google Cloud 專案:
gcloud projects delete abap-sdk-poc

刪除個別資源

  1. 刪除運算執行個體:
gcloud compute instances delete abap-trial-docker
  1. 刪除防火牆規則:
gcloud compute firewall-rules delete sapmachine
  1. 刪除服務帳戶:
gcloud iam service-accounts delete \
    abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com