Compartilhar via


Falhas persistentes do lado do cliente

Em alguns casos, o serviço de enfileiramento de mensagens pode mover uma mensagem para a fila de destino. Por exemplo, se os controles de acesso à fila não permitirem que a mensagem seja movida do cliente para o servidor, a mensagem ofensiva será movida para a fila de letras mortas do lado do cliente. Quando isso ocorre, o serviço de componentes em fila COM+ permite que uma classe de exceção seja associada a um componente. Para associar a classe de exceção ao componente, use a guia Avançado na página de propriedades do componente da ferramenta de administração Serviços de Componente. Você também pode associar a classe de exceção programaticamente, usando o atributo de componente de catálogo ExceptionClass das funções administrativas COM+.

A classe de exceção é definida como o ProgID ou o CLSID de um componente que implementa IPlaybackControl. O serviço de componentes em fila tem um monitor de fila de letras mortas que verifica a fila de letras mortas do Xact. Se houver uma mensagem na fila, o monitor de fila de letras mortas instanciará o manipulador de exceção associado ao componente de destino e chamará IPlaybackControl::FinalClientRetry, indicando que houve um erro irrecuperável do lado do cliente.

Além de IPlaybackControl, o manipulador de exceções deve implementar o mesmo conjunto de interfaces que o componente de servidor para o qual está manipulando exceções. Quando IPlaybackControl::FinalClientRetry é chamado, o tempo de execução dos componentes enfileirados reproduz a mensagem de falha para o manipulador de exceções. Isso permite que o manipulador de exceções implemente um comportamento alternativo para mensagens que não podem ser movidas para o servidor — por exemplo, gerando uma transação de compensação.

Se o manipulador de exceção concluir todas as chamadas de método reproduzidas, a mensagem será removida da fila de letras mortas do Xact e será descartada. Se, no entanto, o manipulador de exceção anular a mensagem retornando um status de falha de uma das chamadas de método, a mensagem será retornada para a fila de letras mortas do Xact. A sequência de eventos a seguir mostra como as exceções do lado do cliente são tratadas:

  1. O serviço de enfileiramento de mensagens não consegue entregar uma mensagem ao servidor e coloca a mensagem na fila de letras mortas do Xact.
  2. O ouvinte de fila de letras mortas (DLQL) localiza uma mensagem na fila de letras mortas do Xact.
  3. O DLQL recupera o componente de destino CLSID da mensagem e verifica se há uma classe de exceção.
  4. O DLQL instancia a classe de exceção.
  5. O DLQL consulta IPlaybackControl para a classe de exceção.
  6. O DLQL chama o método IPlaybackControl::FinalClientRetry na classe exception.
  7. O DLQL reproduz todas as chamadas de propriedade e método da mensagem para a classe de exceção.
  8. O DLQL exclui a mensagem se o manipulador de exceção concluir a transação com êxito. O manipulador de exceção pode emitir IObjectContext::SetAbort e a mensagem permanecerá na fila de letras mortas.

Se qualquer uma das etapas anteriores falhar, a mensagem será deixada na fila de letras mortas do Xact.

Quando iniciado, o DLQL lê cada mensagem na fila de mensagens mortas transacionais do serviço de enfileiramento de mensagens e instancia a classe de exceção para cada mensagem de componentes enfileirados. Depois de passar pela fila, ele aguarda novas mensagens. Em seguida, ele processa cada nova mensagem de fila de letra morta à medida que ela chega.

Se você precisar intervir no processo descrito aqui ou se 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

Erros do lado do servidor