Escrever um ouvinte de evento do Barramento de Serviço que consome mensagens do Microsoft Dataverse

Concluído

Tipos de contratos de barramento de serviço permitidos

O Microsoft Dataverse dá suporte a vários métodos para consumir mensagens de fila do Barramento de Serviço de Mensagens do Azure: fila, unidirecional, bidirecional ou REST. Se estiver usando bidirecional e REST, poderá retornar uma cadeia de caracteres de informações para o Dataverse.

Fila

Não é necessário um ouvinte de fila ativo para enviar um evento para uma fila. Você pode consumir mensagens enfileiradas em sua própria linha do tempo usando uma leitura “destrutiva” ou “não destrutiva”. Uma leitura destrutiva lê a mensagem da fila e a remove, enquanto uma leitura não destrutiva não remove a mensagem da fila. Esse método é útil para cenários do tipo "enviar e esquecer", em que não é essencial que a mensagem seja recebida em determinado momento.

Tópico

Os ouvintes de tópico são semelhantes aos ouvintes de fila, exceto que um ou mais ouvintes podem se inscrever para receber mensagens sobre um determinado tópico. Esse tipo será útil se você precisar de vários consumidores para uma determinada mensagem.

Unidirecional

Os contratos unidirecionais exigem que um ouvinte de eventos ativo consuma uma mensagem que você publica na fila do Barramento de Serviço. Se nenhum ouvinte ativo estiver disponível, a postagem falhará. Se a postagem falhar, o Dataverse tentará postar a mensagem novamente em intervalos de tempo cada vez maiores até que o trabalho do sistema assíncrono seja eventualmente cancelado. Nesse caso, o status do trabalho do sistema deste evento é definido como Falha.

Bidirecional

Os contratos bidirecionais são semelhantes aos contratos unidirecionais, exceto que também permitem retornar um valor de cadeia de caracteres do ouvinte. Se você registrou um plug-in compatível com o Azure personalizado para lançar sua mensagem, poderá consumir esses dados retornados em seu plug-in. Um uso comum desse cenário pode ser se você deseja recuperar a ID de uma linha criada em um sistema externo como parte do processo do ouvinte para mantê-la no ambiente do Dataverse.

REST

Os contratos REST são semelhantes aos contratos bidirecionais, exceto que você os publica em um ponto de extremidade REST.

Gravar um ouvinte de fila

No exercício anterior, você registrou um Ponto Final de Serviço que publica mensagens em um Ponto Final do Barramento de Serviço sempre que os dados da conta são atualizados em seu ambiente do Dataverse. Agora, este exercício descreve como consumir essas mensagens.

  1. Crie um aplicativo de console C# no Visual Studio direcionado ao .NET 4.6.2 ou superior.

  2. Adicione os seguintes pacotes NuGet:

    • WindowsAzure.ServiceBus

    • Microsoft.CrmSdk.CoreAssemblies

  3. No método principal do aplicativo, cole o código a seguir. Substitua a URL do ponto de extremidade pela URL do ponto de extremidade do seu namespace do Barramento de Serviço do Azure e o nome da fila, se for diferente:

    string connectionString =@"[ENDPOINT URL]";
    string queueName = "mslearnsamplequeue";
    QueueClient queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.PeekLock);
    
  4. Para consumir sua mensagem, use o método OnMessage, que permite processar uma mensagem de fila do Barramento de Serviço em uma bomba de mensagens orientada a 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, adicionaremos Console.ReadLine() ao método principal para permitir o processamento de várias mensagens. Observe que este não é um método escalonável para lidar com o processamento de eventos. No entanto, é suficiente para os propósitos de nosso exercício. Convém ter uma solução mais escalonável hospedada em uma Durable Function do Azure ou outro serviço de sua preferência.

    Console.ReadLine();
    
  6. Pressione F5 para executar seu aplicativo. Se já houver mensagens do exercício anterior na fila, elas deverão ser processadas e o conteúdo deverá ser exibido na tela do console. Caso contrário, faça alguma atualização em uma conta no seu ambiente Dataverse.