Compartilhar via


Erros de Server-Side

O ouvinte e o jogador trabalham juntos para lidar com mensagens suspeitas. Se uma transação que está sendo reproduzida falhar, o Enfileiramento de Mensagens moverá a mensagem de entrada de volta para a fila de entrada. O player anulará a transação se receber um HRESULT com falha do componente do servidor ou se ele pegar uma exceção. Se o problema persistir, o ouvinte poderá fazer loop continuamente no seguinte padrão:

  • Desativa a mensagem
  • Cria uma instância do objeto
  • Sofre uma reversão
  • Coloca a mensagem de volta na parte superior da fila

O serviço de componentes na fila lida com essa falha usando uma série de filas de repetição específicas do aplicativo. Criadas quando o componente é instalado, há sete filas para cada aplicativo, da seguinte maneira:

  1. A fila de entrada normal. O nome dessa fila é o nome do aplicativo COM+. Esta é uma fila pública de Enfileiramento de Mensagens.

  2. A primeira fila de repetição. As mensagens serão movidas para cá se a transação falhar repetidamente ao processar mensagens da fila de entrada normal. As mensagens nessa fila são processadas após um minuto. Uma mensagem pode ser repetida três vezes nessa fila antes de ser movida para a parte de trás da segunda fila de repetição. Essa fila é denominada ApplicationName_0. Essa fila é uma fila de Enfileiramento de Mensagens privada.

  3. A segunda fila de repetição. As mensagens serão movidas para cá se a transação falhar repetidamente ao processar mensagens da primeira fila de repetição. As mensagens nessa fila são processadas após dois minutos. Uma mensagem pode ser repetida três vezes nessa fila antes de ser movida para a parte de trás da terceira fila de repetição. Essa fila é denominada ApplicationName_1. Essa fila é uma fila de Enfileiramento de Mensagens privada.

  4. A terceira fila de repetição. As mensagens serão movidas para cá se a transação falhar repetidamente ao processar mensagens da segunda fila de repetição. As mensagens nessa fila são processadas após quatro minutos. Uma mensagem pode ser repetida três vezes nessa fila antes de ser movida para a parte de trás da quarta fila de repetição. Essa fila é denominada ApplicationName_2. Essa fila é uma fila de Enfileiramento de Mensagens privada.

  5. A quarta fila de repetição. As mensagens serão movidas para cá se a transação falhar repetidamente ao processar mensagens da terceira fila de repetição. As mensagens nessa fila são processadas após oito minutos. Uma mensagem pode ser repetida três vezes nessa fila antes de ser movida para a quinta fila de repetição. Essa fila é nomeada ApplicationName_3. Essa fila é uma fila de Enfileiramento de Mensagens privada.

  6. A quinta fila de repetição. As mensagens serão movidas para cá se a transação falhar repetidamente ao processar mensagens da quarta fila de repetição. As mensagens nessa fila são processadas após dezesseis minutos. Uma mensagem pode ser repetida três vezes nessa fila antes de ser movida para a fila de repouso final. Essa fila é denominada ApplicationName_4. Essa é uma fila privada de Enfileiramento de Mensagens.

  7. Uma fila de repouso final específica do aplicativo. As mensagens serão movidas para cá se a transação anular repetidamente quando tenta na quinta fila de repetição. Essa fila é nomeada _DeadQueue ApplicationName. Essa é uma fila privada de Enfileiramento de Mensagens. A fila de repouso final não é atendida por um ouvinte de fila. As mensagens permanecem aqui até que sejam movidas manualmente (talvez pelo utilitário de movimentação de mensagens de componentes na fila) ou sejam limpas pelo Gerenciador de Enfileiramento de Mensagens.

Mensagens que não podem ser reproduzidas porque está claro que todas as tentativas de repetição falharão podem ser movidas diretamente para a fila de repouso final específica do aplicativo sem serem avançadas em todos os níveis de repetição.

O player emite um evento COM+ para notificar as partes interessadas de que as mensagens não podem ser reproduzidas. Os eventos COM+ são emitidos nas seguintes situações:

  • Quando uma transação é anulada
  • Quando uma mensagem é movida de uma fila para outra
  • Quando uma mensagem é depositada na fila de repouso final

As mensagens podem ser modificadas antes de passar de uma fila para outra. O mecanismo de segurança de componentes na fila COM+ permite que uma mensagem seja movida para novas filas e reinserida na fila de entrada inicial do aplicativo. Para obter mais informações sobre a segurança de componentes na fila, consulte de segurança de componentes enfileirados.

As filas de repetição são criadas junto com a fila principal do aplicativo quando o aplicativo é marcado como enfileirado pela ferramenta de administração dos Serviços de Componentes ou usando as funções do SDK Administrativo COM+. O serviço de componentes na fila permite flexibilidade no mecanismo de repetição, permitindo que filas de repetição sejam excluídas. Por exemplo, se todas as filas de repetição forem excluídas, uma mensagem que anula persistentemente será movida diretamente da fila do aplicativo para a fila de repouso final específica do aplicativo. Ao remover uma ou mais das filas de repetição, o número e o comprimento das tentativas podem ser reduzidos. Se as filas forem removidas da sequência de repetição, o tempo das filas restantes corresponderá à posição na sequência de filas de repetição. Por exemplo, se você remover a fila de repetição ApplicationName_1, ApplicationName_2 e ApplicationName_3, as mensagens em ApplicationName_4 serão processadas como se a fila fosse a segunda fila de repetição.

O mecanismo de repetição foi projetado para concluir uma mensagem, se possível. Em alguns casos, talvez não seja possível que a mensagem seja bem-sucedida. Por exemplo, um cliente pode estar tentando retirar dinheiro de uma conta que não tem fundos suficientes. Nestas circunstâncias, você pode lidar com o erro de várias maneiras, incluindo o seguinte:

  • Gerar um diagnóstico e emitir um aviso
  • Criar uma transação de compensação
  • Ignorar o problema e ignorar a mensagem

Assim como falhas persistentes no lado do cliente, o serviço de componentes na fila permite que uma classe de exceção seja associada a um componente. A classe de exceção é associada ao componente usando a guia Advanced na página de propriedades do componente da ferramenta de administração dos Serviços de Componentes ou usando as funções administrativas COM+. A classe de exceção permite que o desenvolvedor tenha controle depois que uma mensagem for repetida e antes que essa mensagem seja movida para a fila de repouso final específica do aplicativo. Para obter mais informações sobre a classe de exceção, consulte falhas de Client-Side persistentes.

Veja a seguir a sequência de eventos para tratamento de exceções do lado do servidor:

  1. A mensagem é movida pelas filas de repetição específicas do aplicativo disponíveis.
  2. A repetição final na última fila de repetição falha.
  3. O tempo de execução do serviço de componentes na fila recupera o componente de destino da mensagem e verifica se há uma classe de exceção.
  4. O tempo de execução cria uma instância da classe de exceção.
  5. As consultas em tempo de execução IPlaybackControl na classe de exceção.
  6. As chamadas de tempo de execução IPlaybackControl::FinalServerRetry na classe de exceção.
  7. O tempo de execução reproduz todas as chamadas de propriedade e método da mensagem para a classe de exceção.
  8. Se as etapas 4 a 6 não forem bem-sucedidas, o tempo de execução moverá a mensagem para a fila de repouso final específica do aplicativo.

Se você precisar intervir no processo descrito acima ou precisar mover uma mensagem de veneno para fora de sua fila de repouso final, use o utilitário de movimentação de mensagens. Para obter mais informações sobre o utilitário de mover mensagens, consulte Tratando erros.

erros Client-Side

de falhas de Client-Side persistentes