使用适用于 Google Cloud 的 ABAP SDK 将事件发布到 Cloud Pub/Sub

1. 简介

在本 Codelab 中,我们列出了使用 ABAP SDK for Google Cloud 将事件发布到 Google Cloud Pub/Sub API 的步骤。

此 Codelab 中使用了以下 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. 概览

本 Codelab 的范围涉及 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 参考 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 项目标识符

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. 在下一个弹出式窗口中,选择本地对象或根据需要提供软件包名称。
  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_V1 的方法 PUBLISH_TOPICS 将消息发布到主题。

方法的签名:

459fe21ce68bd811.png

  1. 在 SAP GUI 中,输入事务代码 SE38
  2. 创建一个名为 ZPUBSUB_DEMO_PUBLISH 的报告。
  3. 在随即打开的弹出式窗口中,提供详细信息(如下所示),然后点击保存

9a180c4e9a1e139.png

  1. 在下一个弹出式窗口中,选择本地对象或根据需要提供软件包名称。
  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 平台的 Pub/Sub API。

现在,您可以继续学习以下 Codelab,继续学习如何使用 ABAP SDK 访问各种 Google Cloud 服务。

  • 从 Cloud Pub/Sub 接收事件
  • 使用分块功能将文件上传到 Cloud Storage 存储分区
  • 从 ABAP 调用 Vertex AI test-bison
  • . . .

9. 清理

如果您不想继续学习与 ABAP SDK for Google Cloud 相关的其他 Codelab,请继续进行清理。

删除项目

  • 删除 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