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

Definir y publicar eventos de plataforma

Objetivos de aprendizaje

Después de completar esta unidad, podrá:
  • Definir un evento de plataforma.
  • Describir cómo se pueden publicar mensajes de eventos de plataforma.
  • Usar un método Apex para publicar un evento.
  • Publicar un evento empleando clics en un proceso o flujo.
  • Publicar un evento con la API de REST mediante la inserción de un sObject.

Definir y publicar eventos de plataforma

Ahora que comprende qué son los eventos de plataforma y cuándo se usan, ¡vamos a ponernos manos a la obra con la definición de un evento de plataforma! ¿Se acuerda de la agencia de noticias Cloud News? Vamos a crear una definición de evento de plataforma que contenga los datos de los eventos de noticias.

Defina un evento de plataforma llamado Cloud News:

  1. En Configuración, ingrese Eventos de plataforma en el cuadro Búsqueda rápida y, a continuación, seleccione Eventos de plataforma.
  2. En la página Eventos de plataforma, haga clic en Nuevo evento de plataforma.
  3. Para Etiqueta, ingrese Cloud News.
  4. Para Etiqueta plural, ingrese Cloud News.
  5. Para Descripción, ingrese Eventos de Cloud News para acceder a las últimas noticias al instante.
  6. Para Comportamiento de publicación, mantenga el valor predeterminado de Publicar tras confirmar.
  7. Haga clic en Guardar.
  8. En la lista relacionada Relaciones y campos personalizados, haga clic en Nuevo.
  9. Seleccione Texto y haga clic en Siguiente.
  10. Para Etiqueta de campo/Nombre de campo, ingrese Ubicación.
  11. Para Longitud, ingrese 100. Mantenga los valores predeterminados de los demás campos y deje el campo Descripción vacío. Haga clic en Guardar.
  12. Realice los pasos 7, 8 y 9 para agregar los dos campos siguientes:
    Etiqueta de campo/Nombre de campo Tipo de campo
    Urgente Casilla
    Contenido de noticias Área de texto (largo)

Para el evento Cloud News que acaba de definir, ha creado campos de diversos tipos, como un campo de texto o una casilla. Los tipos de campos compatibles con los eventos de plataforma son los siguientes:

  • Casilla
  • Fecha
  • Fecha/hora
  • Número
  • Texto
  • Área de texto (largo)

Retención de eventos y campo del sistema ReplayId

Salesforce almacena los eventos de plataforma de alto volumen durante 72 horas en el bus de eventos. Los eventos de volumen estándar que se definieron antes de Spring ’19 se almacenan durante 24 horas en el bus de eventos. 

Nota

Nota

Los eventos recién definidos son de alto volumen de forma predeterminada. Los eventos de volumen estándar son los predecesores de eventos de alto volumen, y ya no puede definir dichos eventos.

Puede recuperar eventos almacenados del bus de eventos utilizando clientes de API de CometD. Puede recuperar todos los eventos almacenados o bien puede especificar el Id. de reproducción de un evento como la línea base para la parte de eventos recuperada. Con desencadenadores de Apex, puede reanudar un desencadenador suspendido y seleccionar los eventos sin procesar retenidos anteriormente. Descubre más adelante en este módulo cómo gestionar suscripciones de desencadenador de Apex.

Aunque Salesforce conserva los registros de eventos temporalmente, no puede consultarlos mediante SOQL o SOSL. De un modo similar, no puede usar registros de eventos en la interfaz de usuario para reportes, vistas de lista o búsquedas. Solo puede recuperar eventos anteriores si se suscribe en CometD y usa una opción de ReplayId. Explicaremos el proceso de suscripción a eventos en la siguiente unidad.

A cada mensaje de evento se le asigna un Id. opaco en el campo ReplayId. El valor de campo ReplayId, que se completa por el sistema cuando se entrega el evento a suscriptores, hace referencia a la posición del evento en la transmisión de eventos. No se garantiza que los valores de Id. de reproducción sean contiguos para los eventos consecutivos. Por ejemplo, el evento que sigue al evento con el Id. 999 puede tener asignado el Id. 1.025. Un suscriptor puede almacenar un valor de Id. de reproducción y usarlo en la renovación de la suscripción para recuperar eventos incluidos en el periodo de retención. Por ejemplo, un suscriptor puede recuperar eventos perdidos después de un error de conexión. Los suscriptores no deben computar los Id. de reproducción nuevos a partir de un Id. de reproducción almacenado para hacer referencia a otros eventos de la transmisión.

Sufijo de nombre de API

Cuando crea un evento de plataforma, el sistema anexa el sufijo __e para crear el nombre de API del evento. Por ejemplo, para el evento Cloud News, el nombre de API es Cloud_News__e. Use el nombre de API siempre que haga referencia al evento de forma programática, como por ejemplo en Apex, la API de REST y la API para compañías.

Eventos de plataforma y transacciones

Los eventos de plataforma que están definidos con el comportamiento de publicación Publicar tras confirmar son transaccionales y pueden revertirse, pero aquellos definidos con el comportamiento de publicación Publicar inmediatamente no se pueden revertir. Observe las diferencias siguientes en el comportamiento.

Comportamiento de publicación Publicar tras confirmar

Un evento de plataforma definido con el comportamiento Publicar tras confirmar se publica únicamente después de que se confirme correctamente una transacción. Defina un evento con esta opción si los suscriptores dependen de los datos que confirme la transacción de publicación. Por ejemplo, imagine que un proceso publica un mensaje de evento y crea un registro de tarea. A continuación, se desencadena un segundo proceso suscrito a un evento y que espera localizar el registro de la tarea. Otro motivo para seleccionar este comportamiento es cuando no desee que el mensaje de evento se publique si falla la transacción.

Comportamiento de publicación Publicar inmediatamente

Un evento de plataforma definido con el comportamiento Publicar inmediatamente se publica cuando la llamada de publicación se ejecuta. Seleccione esta opción si desea que el mensaje de evento se publique independientemente de si la transacción se realiza correctamente. Seleccione esta opción también si el publicador y los suscriptores son independientes, y los suscriptores no dependen de los datos confirmados por el publicador. Por ejemplo, el comportamiento de publicación inmediata es la opción perfecta para eventos que se utilizan con fines de registro. Con esta opción, un suscriptor puede recibir el mensaje de evento antes de que la transacción del publicador confirme los datos.

Publicar eventos

Si su aplicación se encuentra en la plataforma de Salesforce, puede publicar eventos mediante un método Apex o con herramientas declarativas, como Process Builder o Flow Builder. Si su aplicación es una aplicación externa, puede publicar eventos mediante las API de Salesforce.

Publicar mensajes de eventos mediante Apex

Para publicar mensajes de eventos, cree una instancia de un evento y pásela al método EventBus.publish().

En el siguiente ejemplo se crea un evento del tipo Cloud_News__e, se publica y, a continuación, se comprueba si la publicación se ha procesado correctamente o ha generado errores. El método EventBus.publish() devuelve un objeto Database.SaveResult, el cual contiene el resultado de la publicación. Si isSuccess() devuelve true, la solicitud de publicación se coloca en cola en Salesforce para este evento de plataforma de alto volumen. El mensaje de evento podría no publicarse de inmediato. Si If isSuccess() devuelve false, la operación de publicación de eventos dio como resultado errores, que se devuelven en el objeto Database.Error. Este método no devuelve una excepción debido a una operación de publicación incorrecta.

Puede ejecutar el fragmento de código de Apex en Developer Console.

  1. Desde el menú de acceso rápido (Menú de acceso rápido), seleccione Developer Console.
  2. Haga clic en Debug (Depurar) | Open Execute Anonymous Window (Abrir ventana de ejecución anónima).
  3. En la nueva ventana, sustituya todo el contenido por el fragmento de código y haga clic en Execute (Ejecutar).
    // Create an instance of the event and store it in the newsEvent variable
    Cloud_News__e newsEvent = new Cloud_News__e(
               Location__c='Mountain City',
               Urgent__c=true,
               News_Content__c='Lake Road is closed due to mudslides.');
    // Call method to publish events
    Database.SaveResult sr = EventBus.publish(newsEvent);
    // Inspect publishing result
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                         err.getStatusCode() +
                         ' - ' +
                         err.getMessage());
        }
    }

Para publicar más de un evento en la misma llamada, agregue los eventos a una lista de eventos y pase la lista al método EventBus.publish(). El resultado de este método es una matriz de objetos Database.SaveResult (uno para cada evento publicado). EventBus.publish() puede publicar algunos eventos que se pasan, incluso cuando otros eventos no pueden publicarse debido a errores. El método EventBus.publish() no devuelve excepciones provocadas por una operación de publicación incorrecta. Es parecido en su comportamiento al método de Apex Database.insert() cuando se llama con la opción de éxito parcial.

// List to hold event objects to be published.
List<Cloud_News__e> newsEventList = new List<Cloud_News__e>();
// Create event objects.
Cloud_News__e newsEvent1 = new Cloud_News__e(
           Location__c='Mountain City',
           Urgent__c=true,
           News_Content__c='Lake Road is closed due to mudslides.');
Cloud_News__e newsEvent2 = new Cloud_News__e(
           Location__c='Mountain City',
           Urgent__c=false,
           News_Content__c='Small incident on Goat Lane causing traffic.');
// Add event objects to the list.
newsEventList.add(newsEvent1);
newsEventList.add(newsEvent2);
// Call method to publish events.
List<Database.SaveResult> results = EventBus.publish(newsEventList);
// Inspect publishing result for each event
for (Database.SaveResult sr : results) {
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                        err.getStatusCode() +
                        ' - ' +
                        err.getMessage());
        }
    }
}
Nota

Nota

La plataforma de Salesforce proporciona asignaciones para el número de eventos que puede definir en su organización y el número de eventos que puede publicar por hora. Para eventos configurados con el comportamiento Publicar tras confirmar, cada ejecución d método cuenta como una declaración DML en el límite de declaraciones DML de Apex. Puede comprobar el uso de límites utilizando el método de Apex Limits.getDMLStatements(). Para eventos configurados con el comportamiento Publicar inmediatamente, cada ejecución de método cuenta en un límite de publicación de eventos separado de 150 llamadas EventBus.publish(). Puede comprobar el uso de límites utilizando el método de Apex Limits.getPublishImmediateDML(). Para obtener más información, consulte la sección Recursos. 

Publicar mensajes de eventos mediante clics

Para publicar mensajes de eventos sin código, use la función de creación de registros en un proceso o un flujo.

En la siguiente captura de pantalla se muestra una acción Crear un registro de ejemplo en Process Builder que publica un mensaje del evento Cloud News. Básicamente, debe establecer Tipo de registro en el evento de plataforma que desea publicar (Cloud News) y, a continuación, establecer los valores para el evento.

La acción Crear un registro en Process Builder se establece en el tipo de registro Cloud News. Los campos del evento Cloud News se completan.


De un modo similar, puede publicar un mensaje de evento de plataforma con un flujo. Configure un elemento Crear registros para crear una instancia del evento de plataforma (Cloud_News__e) y, a continuación, establezca los valores para el evento. Para establecer el valor del campo Booleano, como por ejemplo Urgent__c, use {!$GlobalConstant.True}.

Publicar mensajes de eventos mediante las API de Salesforce

Las aplicaciones externas usan una API para publicar mensajes de eventos de plataforma. Para publicar eventos, cree registros de su evento del mismo modo que inserta sObjects. Puede usar las API de Salesforce para crear registros de eventos de plataforma, como la API de SOAP, la API de REST o la API masiva.

Por ejemplo, para el evento Cloud News, puede publicar notificaciones del evento mediante la inserción de registros Cloud_News__e. En el siguiente ejemplo se crea un evento del tipo Cloud_News__e en la API de REST.

Extremo REST de sObject:

/services/data/v45.0/sobjects/Cloud_News__e/

Cuerpo de una solicitud POST:

{
   "Location__c" : "Mountain City",
   "Urgent__c" : true,
   "News_Content__c" : "Lake Road is closed due to mudslides."
}

Una vez creado el registro de evento de plataforma, la respuesta REST es similar al siguiente resultado. Los encabezados se han eliminado para abreviar.

HTTP/1.1 201 Created
{
   "id" : "e00xx000000000B",
   "success" : true,
   "errors" : [ ],
   "warnings" : [ ]
}

Puede usar cualquier herramienta de la API de REST o una aplicación cliente HTTP para realizar llamadas de API de REST. Por ejemplo, puede usar Workbench mediante los pasos siguientes.

  1. Inicie sesión en su organización de DE de Trailhead.
  2. Abra una ficha nueva y navegue a Workbench en: https://workbench.developerforce.com/login.php
  3. Para Environment (Entorno), seleccione Production (Producción).
  4. En el caso de la API, seleccione la última versión.
  5. Seleccione I agree to the terms of service (Acepto las condiciones del servicio).
  6. Haga clic en Login with Salesforce (Iniciar sesión con Salesforce).
  7. En la siguiente pantalla, haga clic en Allow (Permitir).
  8. En el menú superior, seleccione utilities (utilidades) | REST Explorer.
  9. Haga clic en POST.
  10. Sustituya el URI por lo siguiente:
    /services/data/v45.0/sobjects/Cloud_News__e
  11. En el caso del cuerpo de la solicitud, agregue el siguiente cuerpo en formato JSON.
    {
       "Location__c" : "Mountain City",
       "Urgent__c" : true,
       "News_Content__c" : "Lake Road is closed due to mudslides."
    }
  12. Haga clic en Execute (Ejecutar). La respuesta que devuelve Salesforce después de la publicación del evento es similar a la siguiente.
    {
      "id" : "e00xx0000000001AAA",
      "success" : true,
      "errors" : [ ],
      "warnings" : [ ]
    }

Una alternativa es publicar un evento en la API de SOAP mediante la llamada create() o bien en la API masiva mediante trabajos por lotes.

Ahora que ya sabe cómo se definen y publican eventos, vamos a explicar cómo suscribirse a ellos.