Empiece a realizar un seguimiento de su progreso
Inicio de Trailhead
Inicio de Trailhead

Suscribirse a eventos de plataforma

Objetivos de aprendizaje

Después de completar esta unidad, podrá:
  • Describir cómo suscribirse a mensajes de eventos de plataforma.
  • Suscribirse a un evento en la plataforma y en aplicaciones externas.
  • Probar eventos de plataforma en un método de prueba de Apex.
  • Suscribirse a eventos de plataforma mediante CometD.

Suscribirse a eventos de plataforma

Ahora que ya sabe cómo se publican los eventos de plataforma, ¿cómo se suscribiría a estos eventos para recibir notificaciones de las últimas noticias o del envío de un paquete? En Salesforce Platform, los desencadenadores, procesos y flujos de Apex. El componente Lightning empApi y las aplicaciones de Visualforce reciben notificaciones de eventos a través de CometD. En el caso de una aplicación externa, también puede suscribirse a los eventos mediante CometD.

Suscribirse a notificaciones de eventos de plataforma con desencadenadores de Apex

Es probable que ya haya usado desencadenadores de Apex para realizar acciones basadas en eventos de base de datos. En el caso de los eventos de plataforma, el proceso es similar. Solo tiene que escribir un desencadenador de Apex posterior a la inserción (“after insert”) en el objeto de evento correspondiente para suscribirse a eventos entrantes. Los desencadenadores proporcionan un mecanismo de suscripción automática en Apex. No es necesario crear de forma explícita ni escuchar un canal. Los desencadenadores reciben notificaciones de eventos de varias fuentes con independencia de que se hayan publicado mediante Apex o las API.

Los eventos de plataforma solo son compatibles con desencadenadores posteriores a la inserción. El evento de desencadenador posterior a la inserción se corresponde con el momento posterior a la publicación de un evento de plataforma. Una vez publicado un mensaje de evento, se activa el desencadenador posterior a la inserción.

Para crear un desencadenador de evento de plataforma, use Developer Console.

  1. Haga clic en el icono Configuración, seleccione Developer Console y haga clic en File | New | Apex Trigger (Archivo | Nuevo | Desencadenador de Apex).
  2. Asigne un nombre, seleccione el evento para el sObject y haga clic en Submit (Enviar).

Developer Console agrega automáticamente el evento after insert a la plantilla del desencadenador. Además, puede crear fácilmente un desencadenador en la página de definición del evento mediante Configuración y la lista relacionada Desencadenadores, pero debe especificar el término clave after insert.

En el siguiente ejemplo se muestra un desencadenador para el evento Cloud News. Se realiza un proceso de iteración en cada evento y se comprueba si una noticia es urgente mediante el campo Urgent__c. Si una noticia es urgente, el desencadenador crea un caso para enviar a un corresponsal y agrega la ubicación del evento al asunto del caso.

// Trigger for listening to Cloud_News events.
trigger CloudNewsTrigger on Cloud_News__e (after insert) {
    // List to hold all cases to be created.
    List<Case> cases = new List<Case>();
    // Get queue Id for case owner
    Group queue = [SELECT Id FROM Group WHERE Name='Regional Dispatch' AND Type='Queue'];
    // Iterate through each notification.
    for (Cloud_News__e event : Trigger.New) {
        if (event.Urgent__c == true) {
            // Create Case to dispatch new team.
            Case cs = new Case();
            cs.Priority = 'High';
            cs.Subject = 'News team dispatch to ' +
                event.Location__c;
            cs.OwnerId = queue.Id;
            cases.add(cs);
        }
   }
    // Insert all cases corresponding to events received.
    insert cases;
}

Configurar los registros de depuración

A diferencia de los desencadenadores de los objetos estándar o personalizados, los desencadenadores de los eventos de plataforma no se ejecutan en la transacción de Apex usada para la publicación de eventos. El desencadenador se ejecuta en su propio proceso debajo de la entidad Proceso automatizado, la cual se corresponde con un usuario del sistema. Por consiguiente, los registros de depuración resultantes para la ejecución del desencadenador se crean mediante la entidad Proceso automatizado y no están disponibles en Developer Console. Para recopilar los registros de un desencadenador de eventos de plataforma, agregue una entrada de indicador de rastreo para la entidad Proceso automatizado en Configuración.

  1. En Configuración, ingrese Registros de depuración en el cuadro Búsqueda rápida y, a continuación, haga clic en Registros de depuración.
  2. Haga clic en Nuevo.
  3. Para Tipo de entidad rastreada, seleccione Proceso automatizado.
  4. Seleccione la fecha de inicio y la fecha de caducidad para los registros que desee recopilar.
  5. Para Nivel de depuración, ingrese * y haga clic en Buscar.
  6. Seleccione un nivel de depuración predefinido, como SFDC_DevConsole, o haga clic en Nuevo para crear su propio nivel de depuración.
  7. Haga clic en Guardar.
Nota

Nota

Los registros de depuración para las pruebas de Apex son una excepción. Se incluyen registros para desencadenadores de eventos en el mismo registro de ejecución de las pruebas.

Consideraciones sobre los desencadenadores de eventos de plataforma

Orden del procesamiento de eventos
Un desencadenador procesa las notificaciones de eventos de plataforma secuencialmente y en el mismo orden en el que se reciben. El orden de los eventos se basa en el Id. de reproducción de eventos. Un desencadenador de Apex puede recibir un lote de eventos cada vez. El orden de los eventos se mantiene en cada lote. Los eventos de un lote se pueden originar en uno o varios publicadores.

Ejecución de desencadenadores asíncrona
Un desencadenador de eventos de plataforma se ejecuta en su propio proceso de forma asíncrona y no forma parte de la transacción que ha publicado el evento. Por lo tanto, es probable que se observe un retraso entre el momento en que se publica el evento y el momento en que el desencadenador procesa el evento. No espere que el resultado de la ejecución del desencadenador esté disponible de inmediato después de la publicación del evento.

Usuario del sistema Proceso automatizado
Dado que los desencadenadores de eventos de plataforma no se ejecutan en función del usuario que los ejecuta, sino en función del usuario del sistema Proceso automatizado, hemos establecido el campo de Id. del propietario de forma explícita en nuestro ejemplo CloudNewsTrigger. Hemos usado el Id. de una cola de usuario de ejemplo llamada Regional Dispatch (Envío regional) para el desencadenador de ejemplo. Si crea un registro de Salesforce con un campo OwnerId en el desencadenador (por ejemplo, un caso o una oportunidad), establezca de forma explícita el Id. de propietario. Una alternativa para los casos y los prospectos es usar reglas de asignación para establecer el propietario.

Además, los campos del sistema de registros creados o actualizados en el desencadenador de eventos, como CreatedById y LastModifiedById, hacen referencia a la entidad Proceso automatizado y no al usuario que realiza la ejecución. Del mismo modo, la declaración de Apex UserInfo.getUserId() devuelve la entidad Proceso automatizado.

Apex Governor Limits
Como ocurre en caso de los desencadenadores de objetos estándar y personalizados, los desencadenadores de eventos de plataforma están sujetos a límites regulados de Apex.

Limitaciones de los desencadenadores de Apex
Los desencadenadores de eventos de plataforma comparten muchas de las limitaciones de los desencadenadores de objetos estándar y personalizados. Por ejemplo, no puede realizar llamadas Apex de forma sincronizada desde los desencadenadores.

Tamaño de lotes de desencadenadores
El tamaño máximo de los lotes en un desencadenador de evento de plataforma es de 2.000 mensajes de eventos, que es mayor que el tamaño de los lotes de desencadenadores de objetos de Salesforce, que es de 200. El tamaño de los lotes se corresponde con el tamaño de la lista Trigger.New. Puede controlar el tamaño de los lotes de un desencadenador de eventos de plataforma y recuperarse del límite y las excepciones no capturadas estableciendo un punto de comprobación Para obtener más información, consulte Procesar mensajes de eventos de plataforma en lotes más pequeños en desencadenadores de Apex en la Guía del desarrollador de eventos de plataforma.

Puede ver el estado de todos los desencadenadores de eventos en la página de detalles de definición de eventos de plataforma de Configuración. Debajo de Suscripciones, se indica cada desencadenador activo junto con la información de ejecución y el estado. Esta información incluye el Id. de reproducción de los últimos eventos publicados y procesados. El estado indica si el desencadenador está en ejecución o desconectado de la suscripción debido a errores sin solución o permisos insuficientes. El estado Error solo se alcanza cuando un desencadenador supera el número máximo de reintentos. En la siguiente captura de pantalla se muestra la lista relacionada Suscripciones de la página de detalles del evento Cloud News.

Nota

Nota

  • La lista relacionada Suscripciones también enumera flujos y procesos suscritos al evento. 
  • La lista relacionada Suscripciones no incluye suscriptores que utilizan CometD o el componente empApi de Lightning. Obtiene información acerca de los otros tipos de suscriptores más adelante en esta unidad. 
  • Para eventos de plataforma de alto volumen, el valor Último Id. publicado no está disponible y siempre se muestra como No disponible.

Gestionar suscriptores de desencadenador de Apex de un evento

Reanude una suscripción suspendida donde se dejó, comenzando desde el mensaje de evento más temprano que está disponible en el bus de eventos. Si desea omitir mensajes de eventos que están causando errores o ya no son necesarios, puede reanudar la suscripción desde el extremo, comenzando desde nuevos mensajes de eventos.

Para gestionar una suscripción de desencadenador, en la lista relacionada Suscripciones, haga clic en Gestionar junto al desencadenador de Apex.

En la página de detalles de suscripción, seleccione la acción apropiada.
  • Para suspender una suscripción en ejecución, haga clic en Suspender.

  • Para reanudar una suscripción suspendida, comenzando desde el primer mensaje de evento disponible en el bus de eventos, haga clic en Reanudar.
  • Para reanudar una suscripción suspendida, a partir de nuevos mensajes de eventos, haga clic en Reanudar desde extremo.


No puede gestionar suscripciones para flujos y procesos a través de la lista relacionada Suscripciones.

Nota

Nota

Cuando guarda un desencadenador, la suscripción de desencadenador se reanuda automáticamente. Para más información, consulte Ver y gestionar suscriptores de un evento en la página de detalles del evento de plataforma en la Guía del desarrollador de eventos de plataforma.

Probar desencadenadores de eventos de plataforma

Asegúrese de que su desencadenador de eventos de plataforma funciona correctamente mediante la adición de una prueba de Apex. Para poder empaquetar o implementar cualquier código Apex (incluidos los desencadenadores) en producción, es necesario realizar pruebas con el código Apex. Para publicar eventos de plataforma en una prueba de Apex, incluya las declaraciones de publicación entre las declaraciones Test.startTest y Test.stopTest.

// Create test events
Test.startTest();
// Publish events
Test.stopTest();
// Perform validation here

En un contexto de prueba, la llamada al método de publicación incluye en la cola la operación de publicación. La declaración Test.stopTest() permite la publicación del evento. Después de Test.stopTest(), realice las validaciones correspondientes.

El siguiente es un ejemplo de una clase de prueba para nuestro evento Cloud_News y su desencadenador asociado. La publicación del evento activa el desencadenador asociado. Después de Test.stopTest(), la prueba verifica que la publicación se realizó correctamente inspeccionando el valor devuelto por isSuccess() en Database.SaveResult. Del mismo modo, la prueba consulta el caso que creó el desencadenador. Si se encuentra el registro del caso, el desencadenador se ejecutó correctamente y se superó la prueba.

@isTest
public class PlatformEventTest {
    @isTest static void test1() {
        // Create test event instance
        Cloud_News__e newsEvent = new Cloud_News__e(
            Location__c='Mountain City',
            Urgent__c=true,
            News_Content__c='Test message.');
        Test.startTest();
        // Call method to publish events
        Database.SaveResult sr = EventBus.publish(newsEvent);
        Test.stopTest();
        // Perform validation here
        // Verify that the publish was successful
        System.assertEquals(true, sr.isSuccess());
        // Check that the case that the trigger created is present.
        List<Case> cases = [SELECT Id FROM Case];
        // Validate that this case was found.
        // There is only one test case in test context.
        System.assertEquals(1, cases.size());
    }
}

Suscribirse a notificaciones de eventos de plataforma con un componente Lightning

Las aplicaciones Lightning pueden utilizar el componente web o Aura Lightning empApi para suscribirse a eventos en la aplicación.

Suscribirse a un componente web Lightning

Para utilizar los métodos empApi en su componente web Lightning, importe los métodos desde el módulo lightning/empApi de la manera siguiente.

import { subscribe, unsubscribe, onError, setDebugFlag, isEmpEnabled }
    from 'lightning/empApi';

Luego llame a los métodos importados en su código JavaScript.

Para consultar un ejemplo de cómo utilizar el módulo lightning/empApi y una referencia completa, consulte la documentación lightning-emp-api en la Biblioteca de componentes Lightning.

Suscribirse a un componente Aura

Para utilizar los métodos empApi en su componente Aura, agregue el componente lightning:empApi dentro de su componente personalizado y asígnele un atributo aura:id.

<lightning:empApi aura:id="empApi"/>

Luego, en el controlador del lado del cliente, agregue funciones para llamar a los métodos de componentes.

Para consultar un ejemplo de cómo utilizar el componente lightning:empApi y una referencia completa, consulte la documentación lightning:empApi en la Biblioteca de componentes Lightning.

Suscribirse a notificaciones de eventos de plataforma con clics

Para suscribirse a mensajes de eventos sin programar, cree un proceso que comience cuando se reciba un mensaje de evento de plataforma.

Esta captura de pantalla muestra que un proceso comienza cuando se recibe un evento de Cloud News. Cuando comienza, el proceso busca un registro de contacto cuya ciudad de envío postal coincide con la ubicación del evento de la notificación.

Pantalla de criterios de coincidencia de Process Builder

De un modo similar, puede suscribirse a un evento de plataforma en flujos empleando un elemento Pausa. En vez de iniciar un flujo cuando se produce un evento de plataforma, un flujo que se inició anteriormente queda en pausa hasta que se reciba un mensaje de un evento de plataforma y luego se reanuda. Por ejemplo, aquí aparece un elemento Pausa que espera hasta que Salesforce reciba un mensaje de evento de Cloud News. El flujo solo se reanuda si la ubicación del evento coincide con {!contact.MailingCity}. {!contact} es una variable de registro en el flujo que almacena valores para un registro de contacto.

Configuración de Pausa en Flow Builder

Suscribirse a notificaciones de eventos de plataforma con CometD

Las aplicaciones externas se suscriben a eventos de plataforma con CometD y realizan un sondeo prolongado. El componente Lightning empApi y páginas de Visualforce, que se ejecutan en la plataforma, pueden utilizar también CometD y se consideran clientes CometD. CometD es un bus de enrutamiento de eventos basado en HTTP ampliable que usa un patrón de la tecnología de inserción AJAX llamado Comet. Permite implementar el protocolo Bayeux. El sondeo prolongado, llamado también programación Comet, permite la emulación de un envío de información de un servidor a un cliente. De un modo similar a un sondeo normal, el cliente se conecta y solicita información del servidor. Sin embargo, en lugar de enviar una respuesta vacía en caso de no haber información disponible, el servidor retiene la solicitud y espera hasta que haya información disponible (o se genere un evento).

Salesforce proporciona una biblioteca de Java, EMP Connector, que permite implementar todos los detalles de la conexión con CometD y el proceso de escucha en un canal. Puede usar EMP Connector para suscribirse fácilmente a eventos de plataforma. EMP Connector oculta la complejidad del proceso de suscripción a eventos. Para obtener más información sobre EMP Connector, consulte el ejemplo de cliente Java de la guía del desarrollador de la API de transmisión.

El proceso de suscripción a notificaciones de eventos de plataforma mediante CometD es similar a la suscripción a eventos de envío de tema o genéricos. La única diferencia es el nombre del canal. El nombre del canal de evento de plataforma distingue entre mayúsculas y minúsculas y está en el siguiente formato.

/event/<EventName>__e

Por ejemplo, si tiene un evento de plataforma llamado Cloud News, especifique el nombre de este canal cuando se suscriba.

/event/Cloud_News__e

Especifique la versión de la API al final de la URL de CometD, como se indica a continuación.

// Connect to the CometD endpoint
    cometd.configure({
               url: 'https://<Salesforce_URL>/cometd/48.0/',
               requestHeaders: { Authorization: 'OAuth <Session_ID>'}
    });

Mensaje de evento de plataforma en formato JSON

El mensaje de un evento de plataforma enviado es similar al siguiente ejemplo de un evento Cloud News.

{
  "data": {
    "schema": "_2DBiqh-utQNAjUH78FdbQ",
    "payload": {
      "CreatedDate": "2017-04-27T16:50:40Z",
      "CreatedById": "005D0000001cSZs",
      "Location__c": "San Francisco",
      "Urgent__c": true,
      "News_Content__c": "Large highway is closed due to asteroid collision."
    },
    "event": {
      "replayId": 2
    }
  },
  "channel": "/event/Cloud_News__e"
}

El campo de esquema del mensaje de evento contiene el Id. del esquema de evento de plataforma (en este ejemplo, "schema": "_2DBiqh-utQNAjUH78FdbQ"). Dado que hay varias versiones del esquema, cuando cambia el esquema, también cambia el Id. del esquema.

Para determinar si el esquema de un evento ha cambiado, recupere el esquema mediante la API de REST. Para usar el Id. del esquema, envíe una solicitud GET a este recurso de la API de REST: /vXX.X/event/eventSchema/Schema_ID. Una alternativa es recuperar el esquema del evento mediante la especificación del nombre del evento en este extremo: /vXX.X/sobjects/Platform_Event_Name__e/eventSchema. Para obtener más información, consulte la guía del desarrollador de la API de REST.

Nota

Nota

A diferencia de los eventos de envío de tema y genéricos, los eventos de plataforma no son compatibles con el uso de suscripciones filtradas. Por ejemplo, la suscripción a /event/Cloud_News__e?Location__c='San Francisco' para filtrar por ubicación no se admite.

Ahora que ya sabe cómo usar los eventos de plataforma en aplicaciones de la plataforma de Salesforce y en aplicaciones externas, ¡las posibilidades son infinitas! Use los eventos de plataforma para cualquier número de aplicaciones e integraciones, como el procesamiento de transacciones de negocio o la asistencia al cliente proactiva. Los eventos de plataforma le permiten adoptar un modelo de programación basado en eventos y disfrutar de las ventajas de una arquitectura de software basada en eventos.