Blog SAPienteSAPiente
RAPEvent Mesh

Como Criar Eventos dentro de uma Aplicação RAP

SAPiente13 de jul. de 2026· 7 min read

Por que seu Business Object deveria "alertar" quando algo muda?

Imagine que toda vez que uma viagem é reservada no seu sistema, três outros sistemas precisam saber: o financeiro, o de aprovação e um data lake. A forma antiga é cada um ficar perguntando "mudou algo?" de tempos em tempos (polling) ou você sair acoplando chamadas síncronas uma a uma. A forma moderna é o seu Business Object gritar uma vez — "viagem reservada!" — e quem se interessar escuta.

Esse "grito" é um RAP Business Event. Desde o release 2208 no cloud (BTP ABAP Environment e S/4HANA Cloud) e 2022 no on-premise, um Business Object do ABAP Cloud define, levanta e publica eventos de negócio nativamente, e o SAP Event Mesh entrega esse evento a quem assinou. E o recurso continua evoluindo: eventos derivados (2308), side effects orientados a eventos (2502 no cloud; S/4HANA 2025 no on-premise/private) e, no release 2025, filtragem outbound e tópicos dinâmicos com o Advanced Event Mesh.

O essencial em 5 linhas

  • Você declara o evento na behavior definition (com um payload tipado) e o levanta com RAISE ENTITY EVENT — que só compila dentro de um behavior pool —, preferencialmente na save sequence.

  • O erro nº 1 de quem começa: esquecer o COMMIT WORK — sem ele, o evento nunca é registrado.

  • O event binding liga o evento a um topic (namespace + SAP Object Type + operation + versão); o channel conecta ao Event Mesh.

  • O consumidor recebe por queue (pull/AMQP/REST), webhook (push) ou até localmente, no mesmo sistema, sem broker nenhum.

  • A entrega é "at least once", então o consumidor precisa ser idempotente.

Uma linha do tempo rápida: como o ABAP chegou até aqui

Eventos no ABAP não nasceram com o RAP — o que nasceu com o RAP foi a integração nativa deles ao modelo de programação:

Geração

Mecanismo

Limitação

Clássico

Business Transaction Events (BTE) e eventos de Workflow (SWE)

Acoplados a function modules e ao motor de workflow; nada de Clean Core

Releases 2008–2205

Business Event Enablement

Funcionava, mas não era integrado ao RAP — evento e BO viviam em mundos separados

Release 2208 (cloud) / 2022 (on-premise)

RAP Business Events

Evento vira parte do BO: mesmo ciclo de vida, extensibilidade, testabilidade e API state via event binding

Essa integração é o ponto-chave: o evento é declarado na BDEF, pode ser adicionado via behavior extension e tem ciclo de vida e estado de API próprios através do event binding — ou seja, é um artefato de primeira classe do modelo, não um apêndice.

Por que eventos em vez de chamadas síncronas?

Porque eventos trocam o acoplamento forte de uma chamada direta pelo modelo publish/subscribe — e isso muda a arquitetura inteira. Os ganhos concretos:

  • Desacoplamento: o produtor não sabe quem consome. Zero, um ou dez consumidores — tanto faz, e adicionar um novo não toca no produtor.

  • Resiliência assíncrona: se o consumidor cair, a mensagem espera na fila do Event Mesh.

  • Near-real-time: o destino reage em segundos, sem polling nem batch.

  • Clean Core: nada de modificação no standard — o evento sai pela camada RAP, e eventos standard extensíveis podem ser enriquecidos via derived events, sem tocar no objeto original.

Não use evento para um fluxo síncrono em que você precisa da resposta na hora (ex.: validar e devolver erro ao usuário). Para isso, uma ação RAP ou uma chamada direta é melhor. Evento é "avise e siga", não "pergunte e espere".

Casos de uso: onde isso encaixa de verdade

Caso 1 — Status de documento replicado para um sistema externo via CPI

Um cenário clássico de projeto: uma requisição de compra (ou ordem, ou documento fiscal) muda de status no S/4HANA e um sistema externo de procurement precisa refletir isso. Em vez de o CPI ficar consultando uma API a cada X minutos, o BO levanta um evento de mudança de status, o Event Mesh entrega numa queue e o iFlow do CPI consome (via adapter AMQP), transforma e chama a API do sistema externo. O S/4 nem sabe que o CPI existe — e se o sistema externo estiver fora do ar, a mensagem espera na fila. Contra duplicatas, o iFlow usa o Idempotent Process Call com o ID do evento.

Caso 2 — Workflow no BTP disparado por criação de registro

Um registro crítico é criado (um cadastro, um contrato) e precisa passar por aprovação no SAP Build Process Automation. O BPA assina o topic do evento "created" e instancia o processo automaticamente. Zero código de disparo no lado do processo.

Caso 3 — Alimentar data lake / analytics em tempo quase real

Cada fato de negócio (pedido criado, entrega confirmada) vira um evento com payload enxuto de chaves. Um consumidor genérico assina a família de topics com wildcard e alimenta o pipeline de dados. Quem precisar do registro completo consulta a API OData/CDS depois — o evento é o gatilho, não o transporte de massa.

Caso 4 — Enriquecer um evento standard da SAP (derived event)

O evento standard de Business Partner traz, por padrão, praticamente só o número do BP. Se o consumidor precisa de nome e sobrenome no payload, você cria um derived event sobre o evento standard, com payload customizado — sem modificar nada do objeto original. Falamos dele em detalhe mais abaixo.

Caso 5 — Carga inicial (initial load) orientada a eventos

Vai plugar um consumidor novo num objeto que já tem milhares de registros? A recomendação da SAP é não reaproveitar os eventos standard para a carga inicial — outros handlers locais podem reagir a eles e gerar efeitos colaterais indesejados. O padrão é criar um evento custom dedicado de initial load e um programa ABAP que lê os dados e dispara um evento por registro:

METHOD if_oo_adt_classrun~main.
  SELECT FROM I_BusinessPartner
    FIELDS BusinessPartner, BusinessPartnerCategory, BusinessPartnerUUID
    INTO TABLE @DATA(lt_bp).

  LOOP AT lt_bp ASSIGNING FIELD-SYMBOL(<bp>).
    zbp_initload_bp=>raise_initial_load(
      VALUE #( ( BusinessPartner = <bp>-BusinessPartner
                 %param = CORRESPONDING #( <bp> ) ) ) ).
  ENDLOOP.

  COMMIT WORK.   " sem isso, nenhum evento sai
ENDMETHOD.

Quando NÃO usar

Cenário

Use no lugar

Validação com resposta imediata ao usuário

Validação/ação RAP síncrona

Consulta pontual de dados

API OData / CDS

Transferência de volume alto de dados por mensagem

Evento com chaves + API de leitura (padrão notificação + callback)

A arquitetura de ponta a ponta

Conhecer cada peça evita perder horas procurando onde a mensagem "sumiu". O caminho completo:

Peça

Onde fica

Papel

Payload (abstract entity)

CDS

Define os campos que viajam no evento

Event

Behavior Definition

Declara o evento e seu parâmetro

RAISE ENTITY EVENT

Behavior Pool (ABAP)

Registra o evento, que é publicado no commit

Event Binding

ADT (objeto próprio)

Liga o evento ao topic (namespace + SAP object type + operation + versão)

Channel

Sistema ↔ Event Mesh

Conexão com a instância de serviço

Outbound topic binding

Channel

Autoriza a publicação daquele topic naquele channel

Queue / Webhook

Event Mesh

Onde o consumidor recebe (pull / push)

E as transações/artefatos de operação que você vai usar (on-premise / private cloud):

Transação

Para quê

/n/IWXBE/CONFIG

Criar e ativar o channel a partir da service key do Event Mesh

/n/IWXBE/OUTBOUND_CFG

Criar o topic binding outbound (channel ↔ topic do event binding)

/n/IWXBE/EVENT_MONITOR

Monitorar se os eventos foram de fato gerados e enviados

No BTP ABAP Environment / S/4HANA Cloud Public, o channel nasce de um communication arrangement com o cenário SAP_COM_0092 (Enterprise Event Enablement), usando a service key da instância do Event Mesh — e a configuração outbound é feita no app Fiori "Enterprise Event Enablement".

Passo a passo

1. Definir o payload (abstract entity)

O conteúdo do evento é tipado por uma CDS abstract entity. Mantenha-a enxuta — payload é contrato, e payload gordo acopla o consumidor ao seu modelo interno. Importante: as chaves da entidade sempre viajam no payload, com ou sem parâmetro; a abstract entity só adiciona campos extras:

define abstract entity ZD_Travel_Booked
{
  TravelId   : /dmo/travel_id;
  CustomerId : /dmo/customer_id;
  TotalPrice : /dmo/total_price;
  Currency   : /dmo/currency_code;
}

2. Declarar o evento na behavior definition

O evento pode ser declarado em qualquer entidade de um BO managed ou unmanaged — e o parâmetro é opcional (sem ele, o payload leva só as chaves):

define behavior for ZI_Travel alias Travel
implementation in class zbp_i_travel unique
{
  create; update; delete;

  // evento de negócio com payload tipado
  event travelBooked parameter ZD_Travel_Booked;

  // evento sem parâmetro: payload = só as chaves
  event travelCancelled;
}

3. Disparar com RAISE ENTITY EVENT

Aqui a documentação é bem específica, e vale conhecer as regras exatas:

  • RAISE ENTITY EVENT é um statement EML que só pode ser usado em ABAP behavior pools — e não confunda com o RAISE EVENT clássico de ABAP Objects, que é outra coisa.

  • Você só pode levantar eventos definidos na BDEF do mesmo RAP BO, referenciados como Entidade~Evento.

  • O dado após o FROM é do tipo derivado TABLE FOR EVENT Entidade~Evento: a linha traz no mínimo as chaves primárias (endereçáveis pelo grupo %key) e, se houver parâmetro, o %param.

  • Esses tipos não têm %tky nem %is_draft — ou seja, não existe evento específico para instâncias draft. Evento é coisa de dado persistido.

  • A recomendação oficial: levantar o evento nos métodos saver save ou save_modified; em BOs managed, o padrão é usar um additional save e disparar de lá.

METHOD save_modified. " ou additional save no managed
  IF create-Travel IS NOT INITIAL.
    RAISE ENTITY EVENT ZI_Travel~travelBooked
      FROM VALUE #( FOR travel IN create-Travel
        ( %key   = travel-%key
          %param = VALUE #( TravelId   = travel-TravelId
                            CustomerId = travel-CustomerId
                            TotalPrice = travel-TotalPrice
                            Currency   = travel-CurrencyCode ) ) ).
  ENDIF.
ENDMETHOD.

O erro que derruba todo mundo: COMMIT WORK. O RAISE ENTITY EVENT registra o evento — quem efetivamente o publica é o commit. Ao disparar via código próprio (um report de teste, um wrapper), é preciso um COMMIT WORK depois; sem ele, o código roda sem erro nenhum e o evento simplesmente nunca chega ao Event Mesh. Esqueceu o commit? O evento não existe.

Por que a save sequence? Porque o evento representa um fato consolidado. A própria arquitetura reforça isso: o BO registra o evento, que é levantado pouco antes do commit ser disparado — nunca no meio de uma validação que ainda pode falhar. (Se você não domina a save sequence, vale revisar o cenário RAP Unmanaged, onde ela é o coração do salvamento.)

Bônus: disparando a partir de código legado (não-RAP)

E se o fato de negócio acontece num report clássico, numa BAPI, num user exit? A SAP documenta o padrão: você não precisa de um BO transacional completo — basta um RAP BO mínimo cuja única função é hospedar o evento, com um método estático público no behavior pool servindo de wrapper para o RAISE ENTITY EVENT:

CLASS zbp_travel_events IMPLEMENTATION.
  METHOD raise_travel_booked. " método estático público (wrapper)
    RAISE ENTITY EVENT ZI_Travel~travelBooked FROM it_events.
  ENDMETHOD.
ENDCLASS.

" ...em qualquer código legado:
zbp_travel_events=>raise_travel_booked( it_events ).
COMMIT WORK.

4. Criar o event binding — e entender a anatomia do topic

O event binding conecta o evento RAP ao topic. Ele referencia um namespace, um SAP object type e uma operation — a concatenação dos três, mais a versão, forma o type/topic do evento. É um objeto próprio que você cria no ADT (New > Other Repository Object > Event Binding), adicionando a root entity e o nome do evento da BDEF. Na prática:

Namespace:        ztravel
SAP Object Type:  Travel
Operation:        Booked

=> Type do evento:      ztravel.Travel.Booked.v1
=> Topic outbound:      ztravel/Travel/Booked/*     " * = versão
=> Assinatura na queue: <namespace-da-instância>/ce/ztravel/Travel/Booked/*

Os nomes são livres, mas a recomendação oficial é definir e seguir uma convenção clara — o topic é o contrato público do seu evento.

5. Criar o channel e o outbound binding

O channel representa uma conexão com uma instância de serviço do Event Mesh. On-premise/private: /n/IWXBE/CONFIG, colando a service key da instância, e ativação do channel. Depois, em /n/IWXBE/OUTBOUND_CFG, você cria o topic binding ligando o topic do seu event binding ao channel — sem esse passo explícito, o evento não é publicado. No BTP/Cloud Public, o equivalente é o communication arrangement SAP_COM_0092 + configuração no app Enterprise Event Enablement.

6. Validar: Event Monitor e o payload que chega

Disparou e não chegou? Antes de sair caçando no Event Mesh, confira /n/IWXBE/EVENT_MONITOR: se o evento não aparece lá, o problema é do lado do produtor (geralmente o famigerado commit ou o topic binding faltando); se aparece e não chega na queue, o problema é channel/assinatura.

Quando chega, a mensagem segue o padrão CloudEvents: o type é o do event binding, e o campo data carrega as chaves do BO + a estrutura do parâmetro. Ilustrativamente:

{
  "specversion": "1.0",
  "type": "ztravel.Travel.Booked.v1",
  "source": "/default/sap.s4h/S4H_001",
  "id": "a8e21f4c-...",
  "time": "2026-07-01T14:32:11Z",
  "data": {
    "TravelId":   "00000042",
    "CustomerId": "000123",
    "TotalPrice": "1250.00",
    "Currency":   "BRL"
  }
}

Consumo local: eventos sem Event Mesh nenhum

Detalhe que muita gente não conhece: um RAP event também pode ser consumido no mesmo sistema em que foi levantado, sem broker, sem binding, sem channel. Basta um RAP event handler class:

  • Uma classe global definida com FOR EVENTS OF nome_do_BO;

  • Dentro dela (em Local Types), uma classe local que herda de cl_abap_behavior_event_handler e implementa métodos FOR ENTITY EVENT;

  • O handler é chamado localmente e processado de forma assíncrona, somente após o commit ter sido concluído com sucesso — você já está fora da save sequence do produtor, mas continua sujeito às fases transacionais do RAP (cl_abap_tx).

CLASS zeh_travel DEFINITION PUBLIC ABSTRACT FINAL
  FOR EVENTS OF ZI_Travel.
ENDCLASS.

" Local Types:
CLASS lhe_travel DEFINITION INHERITING FROM cl_abap_behavior_event_handler.
  PRIVATE SECTION.
    METHODS on_travel_booked FOR ENTITY EVENT
      it_params FOR Travel~travelBooked.
ENDCLASS.

CLASS lhe_travel IMPLEMENTATION.
  METHOD on_travel_booked.
    " o handler inicia na fase MODIFY (default);
    " para gravar no banco / disparar o "fazer", feche a fase antes:
    cl_abap_tx=>save( ).

    LOOP AT it_params INTO DATA(ls_param).
      " reagir ao evento: log, notificação, disparo de processo...
      INSERT ztravel_log FROM @( VALUE #(
        travel_id  = ls_param-TravelId
        event_type = 'BOOKED'
        created_at = utclong_current( ) ) ).
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

Casos de uso do consumo local: desacoplar processos pesados dentro do mesmo sistema (o handler roda assíncrono), disparar log/notificação após o fato consolidado, ou o padrão avançado de consumir um evento standard localmente e re-disparar um evento custom enriquecido quando derived events não estão disponíveis.

Como o consumidor recebe: queue vs. webhook

No Event Mesh, há duas formas de consumir os eventos de uma queue, e a escolha muda totalmente o tratamento de erros:

Modelo

Como funciona

Quando usar

Queue (pull)

O consumidor lê da fila via AMQP ou REST API quando quiser

Consumidor controla o ritmo; processamento em lote; precisa de DMQ + redelivery

Webhook (push)

O Event Mesh empurra a mensagem para um endpoint HTTP

Reação imediata; consumidor sempre disponível

REST pull em produção? A SAP diz não. A própria SAP não recomenda o consumo pull via REST API para cenários produtivos — se a comunicação precisa ser REST, a recomendação é webhook; se precisa de controle fino de redelivery, AMQP. O pull via REST é ótimo para teste, e é assim que usamos ele mais abaixo.

Webhook: QoS e o mecanismo de retry

Dois detalhes de configuração do webhook mudam tudo:

  • QoS 0 = fire and forget: o código HTTP de retorno não é avaliado — a mensagem sai da fila mesmo se o endpoint falhou. Para produção, use QoS 1: a mensagem só é confirmada quando o webhook responde 2xx.

  • Retry próprio: se o endpoint não responde em até 1 minuto ou devolve não-2xx, a mensagem é considerada não confirmada e reentregue após ~15 minutos, repetidamente, até um 2xx ou até a mensagem expirar (TTL). E um webhook segura apenas um punhado de mensagens não confirmadas por vez — endpoint lento trava a esteira.

Dead Message Queue e redelivery

Mensagem que não é consumida com sucesso não pode ficar travando a fila para sempre. É aí que entra a Dead Message Queue (DMQ) e o Max Redelivery Count:

  • O Max Redelivery Count vai de 0 a 255 — e atenção à semântica: 0 significa redelivery ilimitado, não "zero tentativas". Ao configurar uma DMQ, é obrigatório definir o Max Redelivery Count ou habilitar o Respect Time to Live.

  • Atingido o limite de tentativas (ou expirado o TTL), a mensagem é considerada "morta" e movida para a DMQ — onde você investiga sem bloquear o fluxo.

Uma configuração de partida sensata para uma fila produtiva consumida via AMQP:

Parâmetro

Valor de partida

Efeito

Max Redelivery Count

5

Após 5 reentregas falhas, a mensagem vai para a DMQ (lembre: 0 = infinito!)

Dead Message Queue

minha/fila/dmq

Fila dedicada só para as mensagens mortas desta fila

Respect Time to Live

habilitado + TTL

Mensagem velha demais expira e vai para a DMQ em vez de apodrecer na fila

Pegadinha do webhook: o Max Redelivery Count é plenamente suportado no consumo via AMQP — mas não é respeitado ao consumir via webhook. Webhooks têm o próprio mecanismo de retry, que não consulta esse contador. Se você depende de DMQ, planeje o consumo por queue/AMQP.

Filtrando com wildcards no topic

O consumidor não precisa assinar um topic exato. O Event Mesh permite wildcards: * casa um único nível da hierarquia do topic e > casa um ou mais níveis. Na prática:

ztravel/Travel/Booked/v1     " topic exato: só este evento, só esta versão
ztravel/Travel/Booked/*      " este evento, qualquer versão (o padrão do outbound)
ztravel/Travel/*/*           " QUALQUER operação de Travel (Booked, Cancelled...)
ztravel/>                    " tudo do namespace ztravel, qualquer profundidade

Assim, uma única assinatura captura uma família inteira de eventos — útil para um consumidor genérico de "tudo que acontece com Travel". Aliás, você já usa wildcard sem perceber: o sufixo de versão do topic outbound é exatamente isso.

Eventos derivados: estendendo eventos standard

Você não precisa começar do zero. Desde o release 2308 (disponível no S/4HANA Cloud Public Edition e, no private/on-premise, a partir do S/4HANA 2023) existem os Derived Events: você define um novo evento com payload customizado a partir de um evento SAP standard existente. Os pontos que a documentação destaca:

  • O derived event é criado estendendo a behavior definition do BO standard — o que exige que o BO tenha contrato C0 liberado (extensível). Nem todo evento standard é extensível; confira no SAP Business Accelerator Hub, em Events – Event Objects.

  • No payload CDS customizado, a anotação @event.context.attribute transforma campos do payload em atributos de filtro — permitindo que o consumidor filtre eventos por conteúdo, não só por topic.

  • Se o BO standard não for extensível (sem C0), o workaround documentado é: consumir o evento standard localmente, enriquecer os dados e re-disparar um evento custom — lembrando de mudar para a fase de save com cl_abap_tx=>save( ) antes do RAISE ENTITY EVENT:

" handler local do evento STANDARD re-disparando um evento CUSTOM enriquecido
METHOD consume_bp_changed.
  cl_abap_tx=>save( ).   " RAISE ENTITY EVENT exige a fase de save

  SELECT FROM I_BusinessPartner
    FIELDS BusinessPartner, FirstName, LastName
    FOR ALL ENTRIES IN @it_params
    WHERE BusinessPartner = @it_params-BusinessPartner
    INTO TABLE @DATA(lt_bp).

  RAISE ENTITY EVENT z_bp_events~bpChangedEnriched
    FROM VALUE #( FOR bp IN lt_bp
      ( BusinessPartner = bp-BusinessPartner
        %param = VALUE #( FirstName = bp-FirstName
                          LastName  = bp-LastName ) ) ).
ENDMETHOD.

Side effects orientados a eventos: o evento chegando na UI

Novidade recente: os event-driven side effects permitem que, quando um RAP business event específico é levantado, a UI Fiori Elements recarregue automaticamente os targets definidos — atualização assíncrona da tela, sem F5 do usuário. Disponibilidade: release 2502 nos cloud releases (BTP ABAP Environment e S/4HANA Cloud Public) e, para on-premise/private cloud, a partir do S/4HANA 2025 (liberado em outubro de 2025).

Caso de uso típico do sample oficial: um processamento em background (BGPF) recalcula o estoque, atualiza a entidade e levanta o evento — e o campo Quantity na tela do usuário se atualiza sozinho, com direito a popup de notificação. A sintaxe na BDEF base:

// evento habilitado para side effects
event QuantityUpdated for side effects;

side effects
{
  event QuantityUpdated affects field ( Quantity );
}
E na projection, é preciso liberar o uso — no nível do BO e do evento:
use side effects;
define behavior for ZC_InventoryTP alias Inventory
{
  use action reCalculateInventory;
  use event QuantityUpdated;
  ...
}

O que mais chegou no release 2025

Para quem está em private cloud/on-premise, o S/4HANA 2025 reforçou a arquitetura orientada a eventos com:

  • Outbound event filtering: publicação seletiva com base em critérios configuráveis — o evento só sai se atender ao filtro.

  • Dynamic topics com o SAP Event Mesh Advanced Plan, para roteamento mais eficiente.

  • Event logging abrangente, incluindo captura local de eventos processados com sucesso, e agrupamento de eventos do mesmo tipo/objeto numa sessão como "atividades" — menos ruído no monitoramento.

  • Suporte ao SAP Cloud Application Event Hub para consumir eventos de soluções no BTP.

Boas práticas consolidadas

  1. Sempre dê COMMIT WORK ao disparar via código próprio. É o erro nº 1.

  2. Dispare na save sequence (managed: additional save; unmanaged: save/save_modified): evento é fato consumado, não promessa.

  3. Payload enxuto: envie chaves e poucos campos; quem precisar de mais consulta a API. As chaves já vão de graça no payload.

  4. Versione o contrato: o event binding já carrega a versão no topic — use isso. Mudar payload quebra consumidores; trate o topic como contrato público.

  5. Consumidor idempotente: a entrega é "at least once" — duplicatas vão acontecer. No CPI, resolva com o Idempotent Process Call.

  6. Webhook sempre com QoS 1 — QoS 0 descarta mensagem mesmo em erro.

  7. Configure DMQ + Max Redelivery (via AMQP) para não travar a fila com poison messages — lembrando que 0 = ilimitado e que webhook ignora esse contador.

  8. Use wildcards com critério: > captura demais; prefira o mínimo necessário.

  9. Carga inicial com evento dedicado, nunca reaproveitando o evento standard de create/change.

  10. Monitore dos dois lados: /IWXBE/EVENT_MONITOR no produtor, fila/DMQ no Event Mesh.

Perguntas frequentes

Posso disparar um evento fora da save sequence?

Tecnicamente, o RAISE ENTITY EVENT compila em qualquer lugar do behavior pool — mas a recomendação oficial é os métodos saver (save/save_modified, ou additional save no managed), garantindo que o evento só sai quando a transação foi persistida. E, ao disparar de código próprio, sempre com COMMIT WORK na sequência.

Posso disparar de um report clássico ou user exit?

Sim — crie um RAP BO mínimo que hospede o evento e exponha um método estático wrapper no behavior pool. É o padrão documentado pela SAP para integrar código legado à arquitetura de eventos.

Funciona com draft?

Não para instâncias draft: os tipos TABLE FOR EVENT não têm %tky/%is_draft. Evento é sempre sobre o dado ativo, persistido.

A entrega é exactly-once?

Não. A semântica é "at least once": o consumidor pode receber duplicatas e deve ser idempotente. No CPI, o Idempotent Process Call garante o efeito exactly-once.

Qual a diferença entre queue e webhook na prática?

Queue é pull (AMQP com controle pleno de redelivery e DMQ; REST só para teste); webhook é push (o Event Mesh empurra para seu endpoint, com retry próprio que ignora o Max Redelivery Count). Escolha queue/AMQP quando precisa de DMQ; webhook quando precisa de reação imediata — e sempre com QoS 1.

Preciso de Event Mesh ou serve o Advanced Event Mesh?

Os conceitos (topic, queue, subscription, DMQ) valem para os dois. O Advanced Event Mesh (baseado em Solace) adiciona recursos como replay, malha distribuída e — a partir do release 2025 — dynamic topics, úteis em cenários de larga escala. No AEM, a convenção recomendada é uma DMQ separada por fila, nomeada <fila>_dmq.

Como testo o evento sem um consumidor real?

Confirme primeiro no /IWXBE/EVENT_MONITOR que o evento foi gerado. Depois, crie uma queue de teste assinando o topic do seu event binding e leia as mensagens via REST API (pull) — ou pelo próprio botão Consume no cockpit do Event Mesh — após disparar o evento e dar COMMIT WORK.

Conclusão

RAP Business Events transformam mudanças de negócio em eventos consumíveis dentro e fora do sistema — integração assíncrona, desacoplada e em tempo quase real, reusando o que você já sabe de RAP. O fluxo é claro: payload tipado, evento na BDEF, RAISE ENTITY EVENT na save sequence, COMMIT WORK, event binding, channel, outbound binding e consumo por queue, webhook ou handler local. Domine o lado do consumidor — idempotência, QoS, DMQ e wildcards — e você tem uma arquitetura orientada a eventos de verdade, não só um "publish" solto.

Referências oficiais

TagsBDEFBO InterfaceClean CoreHANAEclipseEMLDesenvolvedor
Avalie este conteúdo
para avaliar
SAPiente
@sapiente

Blog sobre SAP, ABAP, BTP, Fiori e tudo que envolve o ecossistema SAP.

Ver perfil →
FacebookInstagramYouTubeTwitter

Comentários 0

Entre na conversa

Faça login para deixar seu comentário neste artigo.

Ainda sem comentários

Seja o primeiro a comentar este artigo.