Compartilhar via


Erros do lado do servidor

O ouvinte e o jogador trabalham juntos para lidar com mensagens venenosas. Se uma transação que está sendo reproduzida falhar, o serviço de enfileiramento de mensagens moverá a mensagem de entrada de volta para a fila de entrada. O jogador anula a transação se receber um HRESULT com falha do componente do servidor ou se pegar uma exceção. Se o problema persistir, o ouvinte poderá fazer um loop contínuo no seguinte padrão:

  • Desenfileira a mensagem
  • Instancia o objeto
  • Sofre uma reversão
  • Coloca a mensagem novamente no topo da fila

O serviço de componentes em fila manipula essa falha usando uma série de filas de repetição específicas do aplicativo. Criado 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 do serviço 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 é chamada ApplicationName_0. Essa fila é uma fila privada do serviço de enfileiramento de mensagens.

  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 é chamada ApplicationName_1. Essa fila é uma fila privada do serviço de enfileiramento de mensagens.

  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 é chamada ApplicationName_2. Essa fila é uma fila privada do serviço de enfileiramento de mensagens.

  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 é chamada ApplicationName_3. Essa fila é uma fila privada do serviço de enfileiramento de mensagens.

  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 é chamada ApplicationName_4. Esta é uma fila privada do serviço 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 for abortada repetidamente quando tentada na quinta fila de repetição. Essa fila é chamada ApplicationName_DeadQueue. Esta é uma fila privada do serviço de enfileiramento de mensagens. A fila de repouso final não é atendida por um ouvinte de fila. As mensagens permanecem aqui até serem movidas manualmente (talvez pelo utilitário de movimentação de mensagens de componentes em fila) ou serem limpas pelo Gerenciador de Enfileiramento de Mensagens.

As mensagens que não são reproduzíveis porque é claro que cada tentativa de repetição falhará 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 jogador 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 é abortada
  • 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 em fila COM+ permite que uma mensagem seja movida para filas de repetição e, em seguida, reinserida na fila de entrada inicial do aplicativo. Para obter mais informações sobre segurança de componentes em fila, consulte Segurança de componentes em fila.

As filas de repetição são criadas junto com a fila de aplicativo principal 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 em fila permite flexibilidade no mecanismo de repetição, permitindo que as filas de repetição sejam excluídas. Por exemplo, se todas as filas de repetição forem excluídas, uma mensagem que abortar persistentemente será movida diretamente da fila do aplicativo para a fila de repouso final específica do aplicativo. Ao remover uma ou mais 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 tem fundos insuficientes. Nessas circunstâncias, você pode manipular 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 descartar a mensagem

Como as falhas persistentes do lado do cliente, o serviço de componentes em fila permite que uma classe de exceção seja associada a um componente. A classe de exceção é associada ao componente usando a guia Avançado na página de propriedades do componente da ferramenta de administração 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 tentada novamente 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 persistentes do lado do cliente.

A seguir está a sequência de eventos para manipulação de exceção do lado do servidor:

  1. A mensagem é movida pelas filas de repetição específicas do aplicativo disponíveis.
  2. A última tentativa na última fila de repetição falha.
  3. O tempo de execução do serviço de componentes em fila recupera o componente de destino da mensagem e verifica se há uma classe de exceção.
  4. O tempo de execução instancia a classe de exceção.
  5. O tempo de execução consulta IPlaybackControl na classe de exceção.
  6. O tempo de execução chama 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 suspeita 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 movimentação de mensagens, consulte Manipulando erros.

Erros do lado do cliente

Falhas persistentes do lado do cliente