Partilhar via


Falhas de Client-Side persistentes

Em alguns casos, 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 enfileirados 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 Advanced na página de propriedades do componente da ferramenta de administração dos Serviços de Componentes. 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 enfileirados tem um monitor de fila de letra morta que verifica a fila de letra morta do Xact. Se houver uma mensagem na fila, o monitor de fila de letra morta 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á lidando com exceções. Quando IPlaybackControl::FinalClientRetry é chamado, o tempo de execução dos componentes enfileirados reproduz a mensagem com 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ções 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 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 da fila de letras mortas (DLQL) encontra 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. As consultas DLQL para IPlaybackControl para a classe de exceção.
  6. O DLQL chama o IPlaybackControl::FinalClientRetry método na classe de exceção.
  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::SetAborte 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 letras 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 por novas mensagens. Em seguida, processa cada nova mensagem de fila de letra morta à medida que 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 Tratamento de erros.

Client-Side Erros

Server-Side Erros