1. Introduzione
Questo codelab ti guida nella ricezione dei dettagli degli eventi da un argomento Google Cloud Pub/Sub utilizzando l'ABAP SDK for Google Cloud. Utilizzeremo i seguenti servizi Google Cloud:
- Cloud Pub/Sub
- Cloud Shell
Prerequisiti
- Assicurati di avere accesso a un sistema SAP con ABAP SDK for Google Cloud installato.
- Per configurare un nuovo sistema, puoi fare riferimento al codelab "Installazione della versione di prova della piattaforma ABAP su Google Cloud Platform e installazione dell'SDK ABAP".
- Hai creato un argomento
PUBSUB_DEMO_TOPIC
nell'ambito del codelab " Send events from SAP to Pub/Sub using ABAP SDK" nel tuo progetto Google Cloud. Se non è stato creato, utilizza il comando riportato di seguito per crearlo:
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
Cosa creerai
Creerai quanto segue:
- Un service account con autorizzazioni "Sottoscrittore" per interagire con l'API Pub/Sub.
- Un programma ABAP per ricevere e confermare i messaggi dall'argomento Pub/Sub.
2. Requisiti
- Browser, ad esempio Chrome o Firefox.
- Un progetto Google Cloud con la fatturazione abilitata o crea un account di prova senza costi di 90 giorni per Google Cloud.
- GUI SAP (Windows o Java) installata nel sistema. Se SAP GUI è già installato sul tuo laptop, connettiti a SAP utilizzando l'indirizzo IP esterno della VM come IP del server applicazioni. Se utilizzi Mac, puoi anche installare SAP GUI per Java disponibile in questo link.
3. Prima di iniziare
- Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud (ad esempio:
abap-sdk-poc
). - Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto. Salta questo passaggio se utilizzi l'account di prova senza costi di 90 giorni.
- Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione in Google Cloud. Nella console Google Cloud, fai clic su Attiva Cloud Shell nell'angolo in alto a destra:
- Esegui questi comandi per autenticarti per il tuo account e impostare il progetto predefinito su
abap-sdk-poc
. La zonaus-west4-b
viene utilizzata come esempio. Se necessario, modifica il progetto e la zona nei seguenti comandi in base alle tue preferenze.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- Nell'ambito del precedente codelab " Invia evento a Pub/Sub", devi aver già attivato l'API Pub/Sub, creato l'argomento e pubblicato messaggi su Pub/Sub.
4. Crea un service account per l'accesso a Pub/Sub
L'utilizzo di un service account con il ruolo Subscriber
è il modo più sicuro per il tuo programma ABAP di ricevere messaggi da Pub/Sub. Questo ruolo limita le autorizzazioni al solo recupero dei messaggi, evitando potenziali vulnerabilità della sicurezza.
Crea l'account di servizio
Per creare un service account con il ruolo richiesto, segui questi passaggi:
- Esegui questo comando nel terminale Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- Ora aggiungi i ruoli richiesti al service account creato nel passaggio precedente:
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'
Il comando precedente utilizza abap-sdk-poc
come segnaposto per il progetto Google Cloud. Sostituisci abap-sdk-poc
con l'ID progetto.
- Per verificare che il ruolo sia stato aggiunto, vai alla pagina IAM. Il service account che hai creato dovrebbe essere elencato insieme al ruolo che gli è stato assegnato.
5. Informazioni sulle sottoscrizioni al pull
Per una sottoscrizione pull, il sistema SAP funge da client sottoscrittore e avvia richieste a un server Pub/Sub per recuperare i messaggi. Il client sottoscrittore utilizza l'API REST Pull.
Metodi API chiave
API Google Cloud Pub/Sub
- pull: avvia una richiesta per recuperare i messaggi.
- acknowledge: segnala a Pub/Sub che un messaggio è stato elaborato correttamente.
ABAP SDK for Google Cloud Equivalents
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
Flusso di messaggi per una sottoscrizione pull
La seguente immagine mostra il flusso di lavoro tra un client sottoscrittore e una sottoscrizione pull.
- Richiesta pull:il sistema SAP (il sottoscrittore) utilizza il metodo pull per richiedere i messaggi dal server Pub/Sub.
- Risposta pull: il server Pub/Sub risponde con zero o più messaggi e ID di riconoscimento. Una risposta con zero messaggi o con un errore non indica necessariamente che non sono disponibili messaggi da ricevere. Questa risposta è PullResponse, come mostrato nell'immagine.
- Riconoscimento:dopo aver elaborato un messaggio, il sistema SAP utilizza il metodo di riconoscimento insieme all'ID di riconoscimento ricevuto. In questo modo, Pub/Sub non invia nuovamente il messaggio.
6. Configurare l'abbonamento e inviare messaggi
Creare una sottoscrizione pull
- Esegui questo comando gcloud per creare una sottoscrizione pull denominata
PUBSUB_DEMO_SUBSCRIPTION
che riceverà messaggi daPUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
Pubblica messaggi
Scegli uno di questi metodi per inviare messaggi a PUBSUB_DEMO_TOPIC
:
- Riutilizza il tuo programma:se hai il programma di un codelab precedente per la pubblicazione, utilizzalo.
- Pubblicazione diretta: per un test rapido, prova una delle seguenti opzioni:
- Console Cloud: pubblica direttamente nella console Google Cloud. Per maggiori dettagli, consulta la documentazione di Pub/Sub.
- Comando gcloud: esegui questo comando:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. Crea la configurazione della chiave client
Ora che hai configurato i prerequisiti lato Google Cloud, possiamo procedere con la configurazione lato SAP.
Per la configurazione relativa all'autenticazione e alla connettività, l'ABAP SDK for Google Cloud utilizza le tabelle /GOOG/CLIENT_KEY
e /GOOG/SERVIC_MAP.
.
Per mantenere la configurazione nella tabella /GOOG/CLIENT_KEY
, segui questi passaggi:
- Nella GUI SAP, inserisci il codice transazione SPRO.
- Fai clic su SAP Reference IMG.
- Fai clic su ABAP SDK for Google Cloud > Impostazioni di base > Configura chiave client.
- Mantieni i seguenti valori nei campi. Lascia vuoti tutti gli altri campi.
Campo | Valore |
Nome della chiave Google Cloud | PUBSUB_SUBSCRIBER |
Nome dell'account di servizio Google Cloud | abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com |
Ambito Google Cloud | https://www.googleapis.com/auth/cloud-platform |
ID progetto | abap-sdk-poc |
Authorization Class | /GOOG/CL_AUTH_GOOGLE |
8. Crea un report ABAP per ricevere messaggi da Google Cloud Pub/Sub
- Accedi al tuo sistema SAP.
- Vai al codice transazione
SE38
e crea un programma di report con il nomeZDEMO_RECEIVE_CPS_EVENTS.
- Nel popup visualizzato, fornisci i dettagli come mostrato di seguito e fai clic su Salva.
- Nel popup successivo, seleziona Oggetto locale o fornisci un nome di pacchetto, a seconda dei casi.
- Nell'editor ABAP, aggiungi il seguente codice:
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.
- Salva e attiva il report.
- Esegui il report (F8).
Se l'esecuzione va a buon fine, dovresti visualizzare l'output del report come mostrato di seguito:
9. Spiegazione del codice del sottoscrittore ABAP Pub/Sub
In sostanza, questo programma ABAP si integra con Google Cloud Pub/Sub come sottoscrittore di messaggi. Controlla una sottoscrizione specificata per rilevare nuovi messaggi on demand, li elabora e poi conferma la ricezione per evitare future riconsegne.
Il programma svolgerà le seguenti attività:
Analisi passo passo
Stabilisci la connessione:
- Stabilisce una connessione HTTP al servizio Google Cloud Pub/Sub utilizzando la classe
/GOOG/CL_PUBSUB_V1
.
Set Parameters:
- ID progetto: estrae l'ID progetto pertinente in cui si trova l'abbonamento Pub/Sub.
- Nome abbonamento:specifica il nome dell'abbonamento da cui estrarre i messaggi (
PUBSUB_DEMO_SUBSCRIPTION
). - Limite di messaggi: imposta il numero massimo di messaggi da recuperare in una singola chiamata API (in questo caso, 1).
Recupera messaggi:
- Chiama il metodo
pull_subscriptions
per recuperare i messaggi dalla sottoscrizione specificata.
Elabora messaggi ricevuti:
- Se esistono messaggi, il programma decodifica i dati, registra i contenuti e invia una conferma.
Riconoscimento dei messaggi:
- Chiama il metodo
acknowledge_subscriptions
per inviare un riconoscimento a Pub/Sub che indica la ricezione corretta dei messaggi. In questo modo, non verranno inviati di nuovo.
Gestisci esito positivo/errori:
- Fornisce messaggi di successo se i messaggi vengono ricevuti e confermati e mostra messaggi di errore per vari scenari di errore (nessun messaggio ricevuto, errori API e così via).
Chiudi connessione:
- Chiude la connessione HTTP al servizio Pub/Sub.
10. Complimenti
Ottimo lavoro per aver completato il Codelab "Ricevere un evento da Cloud Pub/Sub utilizzando l'SDK ABAP per Google Cloud".
Hai creato correttamente un ponte tra ABAP e Google Cloud Pub/Sub. Il completamento del codelab dimostra una solida comprensione della messaggistica basata su eventi e di come utilizzare l'SDK ABAP per Google Cloud per l'integrazione con i servizi Google Cloud. Ben fatto!
Hai sbloccato un nuovo livello di integrazione tra ABAP e i servizi Google Cloud. Amplia i tuoi orizzonti con queste entusiasmanti opzioni:
- Utilizzo dell'API Translation con ABAP SDK for Google Cloud
- Caricare un oggetto di grandi dimensioni in un bucket Cloud Storage utilizzando la suddivisione in blocchi
- Recuperare credenziali/secret da Secret Manager con ABAP SDK for Google Cloud
- Chiamare Vertex AI test-bison da ABAP
- Chiamare BigQuery ML da ABAP
11. Esegui la pulizia
Se non vuoi continuare con i codelab aggiuntivi relativi all'SDK ABAP per Google Cloud, procedi con la pulizia.
Elimina il progetto
- Elimina il progetto Google Cloud:
gcloud projects delete abap-sdk-poc
Eliminare singole risorse
- Elimina l'istanza di calcolo:
gcloud compute instances delete abap-trial-docker
- Elimina le regole firewall:
gcloud compute firewall-rules delete sapmachine
- Elimina il account di servizio:
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com