Escribir una escucha de eventos de Service Bus que consuma mensajes de Microsoft Dataverse

Completado

Tipos de contratos de Service Bus admitidos

Microsoft Dataverse admite varios métodos para consumir los mensajes del servicio de mensajería de Azure Service Bus: cola, unidireccional, bidireccional o REST. Si usa el método bidireccional y REST, puede devolver una cadena de información a Dataverse.

Cola

No es necesario una escucha de cola activa para enviar un evento a una cola. Puede consumir mensajes en cola en su propia escala de tiempo usando una lectura "destructiva" o "no destructiva". Una lectura destructiva lee el mensaje de la cola y lo elimina, mientras que una lectura no destructiva no lo elimina. Este método es útil para escenarios de "enviar y olvidar" en los que no es crítico que el mensaje se reciba en un momento determinado.

Tema

Las escuchas de tema son similares a las escuchas de cola, excepto que pueden suscribirse una o más escuchas para recibir mensajes para un tema determinado. Este tipo es útil si necesita múltiples consumidores para un mensaje dado.

Unidireccional

Los contratos unidireccionales requieren que una escucha de eventos activa para consumir un mensaje que se publica en la cola de Service Bus. Si no hay una escucha activa disponible, la publicación falla. Si la publicación falla, Dataverse vuelve a intentar publicar el mensaje en intervalos de tiempo exponencialmente cada vez más largos hasta que el trabajo del sistema asincrónico se cancele finalmente. En este caso, el estado del trabajo del sistema de este evento se establece en Con errores.

Bidireccional

Los contratos bidireccionales son similares a los contratos unidireccionales, excepto que también le permiten devolver un valor de cadena desde la escucha. Si ha registrado un complemento personalizado compatible con Azure para publicar el mensaje, puede consumir estos datos devueltos en el complemento. Una aplicación común de este escenario podría ser recuperar el id. de una fila creada en un sistema externo como parte del proceso de escucha para mantenerlo en el entorno de Dataverse.

REST

Los contratos REST son similares a los contratos bidireccionales, excepto que los publica en un punto de conexión REST.

Escribir una escucha de cola

En el ejercicio anterior, registró un punto de conexión de servicio que publica mensajes en un punto de conexión de Service Bus cada vez que los datos de la cuenta se actualizan en el entorno de Dataverse. Ahora, en este ejercicio se describe cómo consumir esos mensajes.

  1. Cree una aplicación de consola de C# orientada a .NET 4.6.2 o posterior en Visual Studio.

  2. Agregue los siguientes paquetes NuGet:

    • WindowsAzure.ServiceBus

    • Microsoft.CrmSdk.CoreAssemblies

  3. En el método Main de la aplicación, pegue el siguiente código. Reemplace la URL del punto de conexión con la URL del punto de conexión del espacio de nombres de Azure Service Bus y el nombre de la cola si es diferente:

    string connectionString =@"[ENDPOINT URL]";
    string queueName = "mslearnsamplequeue";
    QueueClient queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.PeekLock);
    
  4. Para consumir el mensaje, use el método OnMessage, que le permite procesar un mensaje de cola de Service Bus en una bomba de mensajes controlada por eventos.

    queueClient.OnMessage(message =>
    {
      //get RemoteExecutionContext based on Message Format
      RemoteExecutionContext context = null;
    
      if (message.ContentType == "application/msbin1") //.NETBinary Message Format
      {
        context = message.GetBody<RemoteExecutionContext>();
      }
      else if (message.ContentType == "application/json") //JSON Message Format
      {
        context = message.GetBody<RemoteExecutionContext>(new DataContractJsonSerializer(typeof(RemoteExecutionContext)));
      }
      else if (message.ContentType == "application/xml") //XML Message Format
      {
        context = message.GetBody<RemoteExecutionContext>(new DataContractSerializer(typeof(RemoteExecutionContext)));
      }
      try
      {
        var target = context.InputParameters["Target"] as Entity;
    
        foreach (var field in target.Attributes)
        {
          Console.WriteLine($"Name: {field.Key} Value: { field.Value}");
        }
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.ToString());
      }
    });
    
  5. Por último, vamos a agregar Console.ReadLine() a nuestro método principal para permitir que se procesen varios mensajes. Tenga en cuenta que este no es un método escalable para la gestión del procesamiento de eventos. Sin embargo, es suficiente para los propósitos de nuestro ejercicio. Lo recomendable es tener una solución más escalable hospedada en una función Azure Durable u otro servicio de su preferencia.

    Console.ReadLine();
    
  6. Presione F5 para ejecutar la aplicación. Si ya hay mensajes del ejercicio anterior en la cola, deberían procesarse y su contenido debería mostrarse en la pantalla de la consola. De lo contrario, puede invocar una actualización mediante la actualización de una cuenta en el entorno de Dataverse.