Odbieranie zdarzenia z Cloud Pub/Sub w SAP za pomocą pakietu SDK ABAP dla Google Cloud

1. Wprowadzenie

Ten warsztat programistyczny poprowadzi Cię przez proces otrzymywania szczegółów zdarzeń z tematu Google Cloud Pub/Sub za pomocą pakietu ABAP SDK for Google Cloud. Wykorzystamy te usługi Google Cloud:

  • Cloud Pub/Sub
  • Cloud Shell

Wymagania wstępne

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Co utworzysz

Utwórz:

  • konto usługi z uprawnieniami „Subskrybujący” do interakcji z interfejsem Pub/Sub API.
  • program ABAP do odbierania i potwierdzania wiadomości z tematu Pub/Sub;

2. Wymagania

  • przeglądarki, takie jak Chrome czy Firefox;
  • Projekt Google Cloud z włączonymi płatnościami lub utwórz konto na 90-dniowy okres próbny w Google Cloud Platform.
  • interfejs graficzny SAP (wersja na system Windows lub Java) zainstalowany w systemie; Jeśli interfejs SAP GUI jest już zainstalowany na laptopie, połącz się z SAP, używając zewnętrznego adresu IP maszyny wirtualnej jako adresu IP serwera aplikacji. Jeśli używasz komputera Mac, możesz też zainstalować interfejs SAP dla Javy, który jest dostępny pod tym linkiem.

3. Zanim zaczniesz

6757b2fb50ddcc2d.png

  • Uruchom te polecenia, aby uwierzytelnić swoje konto i ustawić projekt domyślny jako abap-sdk-poc. W tym przykładzie użyto strefy us-west4-b. W razie potrzeby zmień projekt i strefę w poniższych poleceniach zgodnie ze swoimi preferencjami.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Tworzenie konta usługi na potrzeby dostępu do Pub/Sub

Korzystanie z konta usługi z rolą Subscriber to najbezpieczniejszy sposób, aby program ABAP otrzymywał wiadomości z Pub/Sub. Ta rola ogranicza uprawnienia tylko do pobierania wiadomości, co zapobiega potencjalnym luk w zabezpieczeniach.

Tworzenie konta usługi

Aby utworzyć konto usługi z wymaganą rolą, wykonaj te czynności:

  1. Uruchom w terminalu Cloud Shell to polecenie:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Teraz dodaj wymagane role do konta usługi utworzonego w poprzednim kroku:
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/pubsub.subscriber'

W powyższym poleceniu abap-sdk-poc jest miejscem zastępczym dla projektu Google Cloud. Zastąp abap-sdk-poc identyfikatorem projektu.

  1. Aby sprawdzić, czy dodano rolę, otwórz stronę IAM. Utworzone konto usługi powinno być wymienione wraz z przypisaną do niego rolą.

5. Subskrypcje typu pull

W przypadku subskrypcji typu „pull” system SAP działa jako klient subskrybenta i inicjuje żądania do serwera Pub/Sub, aby pobrać wiadomości. Klient subskrybenta używa interfejsu REST Pull API.

Najważniejsze metody interfejsu API

Google Cloud Pub/Sub API

  • pull: inicjuje żądanie pobierania wiadomości.
  • acknowledge: sygnalizuje Pub/Sub, że wiadomość została pomyślnie przetworzona.

Pakiet ABAP SDK dla Google Cloud Equivalents

  • /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
  • /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS

Przepływ wiadomości w przypadku subskrypcji pull

Poniższy obraz przedstawia przepływ pracy między klientem subskrybenta a subskrypcją typu „pull”.

f0fc44265192f348.png

  1. Żądanie pull: system SAP (subskrybent) używa metody pull do żądania wiadomości od serwera Pub/Sub.
  2. Odpowiedź metody pull: serwer Pub/Sub odpowiada z 0 lub większą liczbą wiadomości i identyfikatorów potwierdzenia. Odpowiedź z zerową liczbą wiadomości lub z błędem niekoniecznie oznacza, że nie ma żadnych wiadomości do odebrania. Ta odpowiedź to odpowiedź PullResponse, jak pokazano na obrazie.
  3. Potwierdzenie: po przetworzeniu wiadomości system SAP używa metody potwierdzenia wraz z otrzymanym identyfikatorem potwierdzenia. Zapobiega to ponownemu dostarczeniu wiadomości przez Pub/Sub.

6. Konfigurowanie subskrypcji i wysyłanie wiadomości

Tworzenie subskrypcji pull

  • Aby utworzyć subskrypcję typu „pull” o nazwie PUBSUB_DEMO_SUBSCRIPTION, która będzie odbierać wiadomości z tematu PUBSUB_DEMO_TOPIC, uruchom to polecenie gcloud:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Publikowanie wiadomości

Aby wysłać wiadomość do PUBSUB_DEMO_TOPIC, wybierz jedną z tych metod:

  • Ponowne użycie programu: jeśli masz program z poprzedniego Codelab , którego chcesz użyć do opublikowania, użyj go.
  • Publikowanie bezpośrednie: aby szybko przetestować tę funkcję, wypróbuj jedną z tych opcji:
  • Cloud Console: publikowanie bezpośrednio w Google Cloud Console. Więcej informacji znajdziesz w dokumentacji Pub/Sub.
  • Polecenie gcloud: uruchom to polecenie:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Tworzenie konfiguracji klucza klienta

Ponieważ masz już skonfigurowane wymagania wstępne po stronie Google Cloud, możemy przejść do konfiguracji po stronie SAP.

W przypadku konfiguracji związanej z uwierzytelnianiem i łącznością pakiet ABAP SDK for Google Cloud używa tabel /GOOG/CLIENT_KEY i /GOOG/SERVIC_MAP..

Aby zachować konfigurację w tabeli /GOOG/CLIENT_KEY, wykonaj te czynności:

  1. W interfejsie graficznym SAP wpisz kod transakcji SPRO.
  2. Kliknij SAP Reference IMG (Referencyjny obraz SAP).
  3. Kliknij ABAP SDK for Google Cloud > Ustawienia podstawowe > Skonfiguruj klucz klienta.

25871e639293b9ee.png

  1. Zachowaj te wartości w polach. Pozostaw wszystkie pozostałe pola puste.

Pole

Wartość

Nazwa klucza Google Cloud

PUBSUB_SUBSCRIBER

Nazwa konta usługi Google Cloud

abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com

Zakres Google Cloud

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

Identyfikator projektu

abap-sdk-poc

Klasa autoryzacji

/GOOG/CL_AUTH_GOOGLE

8. Tworzenie raportu ABAP do odbierania wiadomości z Google Cloud Pub/Sub

  1. Zaloguj się w systemie SAP.
  2. Otwórz kod transakcji SE38 i utwórz program raportowania o nazwie ZDEMO_RECEIVE_CPS_EVENTS..
  3. W wyświetlonym okienku podaj informacje widoczne poniżej i kliknij Zapisz.

7c739236bedb5bf1.png

  1. W wyskakującym okienku wybierz Obiekt lokalny lub podaj nazwę pakietu.
  2. W edytorze ABAP dodaj ten kod:
REPORT zdemo_receive_cps_events.

TYPES: BEGIN OF ty_event_message,
         event_time  TYPE timestamp,
         event_type  TYPE char30,
         source      TYPE char30,
         sales_order TYPE vbeln,
       END OF ty_event_message.

DATA: ls_input     TYPE /goog/cl_pubsub_v1=>ty_026,
      ls_input_ack TYPE /goog/cl_pubsub_v1=>ty_001,
      ls_event_msg TYPE ty_event_message.

TRY.

    "Open HTTP Connection
    DATA(lo_client) = NEW /goog/cl_pubsub_v1( iv_key_name = 'PUBSUB_SUBSCRIBER' ).

    "Populate relevant parameters
    " Derive project id from the client object
    DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).
    " Name of the subscription from where we want to pull data
    DATA(lv_p_subscriptions_id) = CONV string( 'PUBSUB_DEMO_SUBSCRIPTION' ).
    " Max number of messages that will be received in 1 API call
    ls_input-max_messages = 1.

    "Call API method: pubsub.projects.subscriptions.pull
    lo_client->pull_subscriptions(
      EXPORTING
        iv_p_projects_id      = lv_p_projects_id
        iv_p_subscriptions_id = lv_p_subscriptions_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 ).
      DATA(ls_received_msg) = VALUE #( ls_output-received_messages[ 1 ] OPTIONAL ).
      IF ls_received_msg IS NOT INITIAL.
        "Messages published to Pub/Sub should be base-64 encoded, hence in order to get the exact message, we need to decode the data field.
        "However, attributes published to Pub/Sub should be accessible as data references.
        DATA(lv_msg) = |{ cl_http_utility=>decode_base64( encoded = ls_received_msg-message-data ) }|.
        /ui2/cl_json=>deserialize( EXPORTING json          = lv_msg
                                             pretty_name   = /ui2/cl_json=>pretty_mode-extended
                                   CHANGING  data          = ls_event_msg ).

        cl_demo_output=>new( )->begin_section( |Receive Events from Cloud Pubsub using ABAP SDK for Google Cloud|
        )->write_text( |The below event was successfully received with message ID { ls_received_msg-message-MESSAGE_ID }|
        )->write_data( ls_event_msg
        )->end_section(
        )->display( ).

        ls_input_ack-ack_ids = VALUE #( ( ls_received_msg-ack_id ) ).

        "Call API method: pubsub.projects.subscriptions.acknowledge
        "Acknowledge the messages so it is not pulled again.
        lo_client->acknowledge_subscriptions(
          EXPORTING
            iv_p_projects_id      = lv_p_projects_id
            iv_p_subscriptions_id = lv_p_subscriptions_id
            is_input              = ls_input_ack
          IMPORTING
            es_output             = DATA(ls_output_ack)
            ev_ret_code           = lv_ret_code
            ev_err_text           = lv_err_text
            es_err_resp           = ls_err_resp ).

        IF lo_client->is_success( lv_ret_code ).
          MESSAGE lv_msg TYPE 'S'.
        ELSE.
          MESSAGE lv_err_text TYPE 'E'.
        ENDIF.
      ELSE.
        MESSAGE 'No Messages were received!' TYPE 'S'.
      ENDIF.
    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'.
ENDTRY.
  1. Zapisz i aktywuj raport.
  2. Wykonaj raport (F8).

Po pomyślnym wykonaniu powinieneś zobaczyć dane wyjściowe raportu, jak pokazano poniżej:

5b76e886ef79d0ba.png

9. Omówienie kodu subskrybenta ABAP Pub/Sub

Zasadniczo ten program ABAP integruje się z Google Cloud Pub/Sub jako subskrybent wiadomości. Sprawdza ona określoną subskrypcję pod kątem nowych wiadomości na żądanie, przetwarza je, a następnie potwierdza ich odbiór, aby zapobiec ich ponownemu wysyłaniu.

Program będzie wykonywać te czynności:

Szczegółowy opis

Ustal połączenie:

  • Nawiązuje ono połączenie HTTP z usługą Google Cloud Pub/Sub za pomocą klasy /GOOG/CL_PUBSUB_V1.

Ustaw parametry:

  • Identyfikator projektu: wyodrębnia odpowiedni identyfikator projektu, w którym znajduje się subskrypcja Pub/Sub.
  • Nazwa subskrypcji: określa nazwę subskrypcji, z której mają być pobierane wiadomości (PUBSUB_DEMO_SUBSCRIPTION).
  • Limit wiadomości: określa maksymalną liczbę wiadomości do pobrania w pojedynczym wywołaniu interfejsu API (w tym przypadku 1).

Pobieranie wiadomości:

  • Wywołuje metodę pull_subscriptions, aby pobrać wiadomości z określonej subskrypcji.

Przetwarzanie otrzymanych wiadomości:

  • Jeśli są, program dekoduje dane, rejestruje zawartość i wysyła potwierdzenie.

Potwierdzanie wiadomości:

  • Wywołuje metodę acknowledge_subscriptions, aby wysłać do Pub/Sub potwierdzenie odbioru wiadomości. Zapobiega to ich ponownemu dostarczeniu.

Obsługa sukcesu i błędów:

  • wyświetla komunikaty o udanych operacjach, jeśli wiadomości zostały odebrane i potwierdzone, oraz komunikaty o błędach w różnych scenariuszach niepowodzenia (brak wiadomości, błędy interfejsu API itp.).

Close Connection:

  • Zamyka połączenie HTTP z usługą Pub/Sub.

10. Gratulacje

Gratulacje! Ukończyłeś/ukończyłas ćwiczenie Codelab „Odbieranie zdarzenia z Cloud Pub/Sub za pomocą ABAP SDK for Google Cloud”.

Udało Ci się połączyć ABAP z Google Cloud Pub/Sub. Ukończenie tego ćwiczenia pokazuje, że dobrze rozumiesz wiadomości sterowane zdarzeniami i wiesz, jak używać pakietu ABAP SDK for Google Cloud do integracji z usługami Google Cloud. Brawo!

Udało Ci się osiągnąć nowy poziom integracji ABAP z usługami Google Cloud. Poszerz swoje horyzonty dzięki tym ekscytującym opcjom:

  • Korzystanie z interfejsu Translation API z pakietem ABAP SDK for Google Cloud
  • Przesyłanie dużego obiektu do zasobnika Cloud Storage za pomocą dzielenia na części
  • Pobieranie danych logowania i obiektów tajnych z usługi Secret Manager za pomocą pakietu ABAP SDK for Google Cloud
  • Wywoływanie usługi Vertex AI test-bison z ABAP
  • Wywoływanie BigQuery ML z ABAP

11. Czyszczenie danych

Jeśli nie chcesz kontynuować dodatkowych samouczków związanych z pakietem ABAP SDK dla Google Cloud, przejdź do czyszczenia.

Usuwanie projektu

  • Usuń projekt Google Cloud:
gcloud projects delete abap-sdk-poc

Usuwanie poszczególnych zasobów

  1. Usuń instancję obliczeniową:
gcloud compute instances delete abap-trial-docker
  1. Usuń reguły zapory sieciowej:
gcloud compute firewall-rules delete sapmachine
  1. Usuń konto usługi:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com