Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O ouvinte e o jogador trabalham juntos para lidar com mensagens venenosas. Se uma transação que está sendo reproduzida falhar, 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:
- Elimina a mensagem da fila
- Instancia o objeto
- Sofre uma reversão
- Coloca a mensagem novamente no topo da fila
O serviço de componentes enfileirados lida com 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:
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.
A primeira fila de novas tentativas. As mensagens são movidas para cá se a transação falhar repetidamente ao processar mensagens da fila de entrada normal. As mensagens nesta fila são processadas após um minuto. Uma mensagem pode ser repetida três vezes nesta fila antes de ser movida para a parte de trás da segunda fila de tentativas. Essa fila é chamada ApplicationName_0. Esta fila é uma fila privada do serviço de enfileiramento de mensagens.
A segunda fila de retentativas. As mensagens são movidas para cá se a transação falhar repetidamente ao processar mensagens da primeira fila de tentativas. As mensagens nesta fila são processadas após dois minutos. Uma mensagem pode ser repetida três vezes nesta fila antes de ser movida para a parte de trás da terceira fila de tentativas. Essa fila é chamada ApplicationName_1. Esta fila é uma fila privada do serviço de enfileiramento de mensagens.
A terceira fila de retentativas. As mensagens são movidas para cá se a transação falhar repetidamente ao processar mensagens da segunda fila de tentativas. As mensagens nesta fila são processadas após quatro minutos. Uma mensagem pode ser repetida três vezes nesta fila antes de ser movida para a parte de trás da quarta fila de tentativas. Essa fila é chamada ApplicationName_2. Esta fila é uma fila privada do serviço de enfileiramento de mensagens.
A quarta fila de retentativas. As mensagens são movidas para cá se a transação falhar repetidamente ao processar mensagens da terceira fila de tentativas. As mensagens nesta 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 tentativas. Essa fila é chamada ApplicationName_3. Esta fila é uma fila privada do serviço de enfileiramento de mensagens.
A quinta fila de retentativas. As mensagens são movidas para cá se a transação falhar repetidamente ao processar mensagens da quarta fila de tentativas. As mensagens nessa fila são processadas após dezesseis minutos. Uma mensagem pode ser repetida três vezes nesta 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.
Uma fila de repouso final específica do aplicativo. As mensagens são movidas para cá se a transação for abortada repetidamente quando tentada na quinta fila de tentativas. 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 dos componentes em fila) ou serem limpas pelo Gerenciador de Enfileiramento de Mensagens.
As mensagens que não podem ser reproduzidas 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 por 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 enfileirados 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 a segurança de componentes em fila, consulte Queued Components Security.
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 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 das filas de repetição, o número e o comprimento das novas tentativas podem ser reduzidos. Se as filas forem removidas da sequência de novas tentativas, o tempo das filas restantes corresponderá à posição na sequência de filas de novas tentativas. 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 tentativas.
O mecanismo de repetição é projetado para completar uma mensagem, se possível. Em alguns casos, pode não ser possível que a mensagem seja bem-sucedida. Por exemplo, um cliente pode estar a tentar levantar dinheiro de uma conta que não tem fundos suficientes. Nessas 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 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 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 Persistent Client-Side Failures.
A seguir está a sequência de eventos para o tratamento de exceções do lado do servidor:
- A mensagem é movida pelas filas de repetição específicas do aplicativo disponíveis.
- A última tentativa na última fila de tentativas falha.
- O tempo de execução do serviço de componentes enfileirados recupera o componente de destino da mensagem e verifica se há uma classe de exceção.
- O tempo de execução instancia a classe de exceção.
- As consultas de tempo de execução IPlaybackControl na classe de exceção.
- As chamadas em tempo de execução IPlaybackControl::FinalServerRetry na classe de exceção.
- O tempo de execução reproduz todas as chamadas de propriedade e método da mensagem para a classe de exceção.
- 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 Tratamento de erros.
Tópicos relacionados