Errores de Client-Side persistentes
En algunos casos, Message Queuing puede mover un mensaje a la cola de destino. Por ejemplo, si los controles de acceso a la cola no permiten que el mensaje se mueva del cliente al servidor, el mensaje infractor se mueve a la cola de mensajes fallidos del lado cliente. Cuando esto ocurre, el servicio de componentes en cola com+ permite asociar una clase de excepción a un componente. Para asociar la clase de excepción con el componente, use la pestaña Opciones avanzadas de la página de propiedades del componente de la herramienta de administración servicios de componentes. También puede asociar la clase de excepción mediante programación mediante el atributo de componente del catálogo ExceptionClass de las funciones administrativas de COM+.
La clase de excepción se define como ProgID o CLSID de un componente que implementa IPlaybackControl. El servicio de componentes en cola tiene un monitor de cola de mensajes fallidos que examina la cola de mensajes fallidos de Xact. Si hay un mensaje en la cola, el monitor de cola de mensajes fallidos crea una instancia del controlador de excepciones asociado al componente de destino y llama a IPlaybackControl::FinalClientRetry, lo que indica que se ha producido un error irrecuperable del lado cliente.
Además de IPlaybackControl, el controlador de excepciones debe implementar el mismo conjunto de interfaces que el componente de servidor para el que controla las excepciones. Cuando se llama a IPlaybackControl::FinalClientRetry , los componentes en cola en tiempo de ejecución reproducen el mensaje con errores en el controlador de excepciones. Esto permite que el controlador de excepciones implemente un comportamiento alternativo para los mensajes que no se pueden mover al servidor; por ejemplo, mediante la generación de una transacción de compensación.
Si el controlador de excepciones completa todas las llamadas de método reproducidas, el mensaje se quita de la cola de mensajes fallidos Xact y se descarta. Sin embargo, si el controlador de excepciones anula el mensaje devolviendo un estado de error de una de las llamadas de método, el mensaje se devuelve a la cola de mensajes fallidos de Xact. La siguiente secuencia de eventos muestra cómo se controlan las excepciones del lado cliente:
- Message Queuing no puede entregar un mensaje al servidor y coloca el mensaje en la cola de mensajes fallidos de Xact.
- El agente de escucha de cola de mensajes fallidos (DLQL) busca un mensaje en la cola de mensajes fallidos de Xact.
- DlQL recupera el CLSID del componente de destino del mensaje y comprueba si hay una clase de excepción.
- DlQL crea una instancia de la clase de excepción.
- Las consultas DLQL para IPlaybackControl para la clase de excepción.
- DlQL llama al método IPlaybackControl::FinalClientRetry en la clase de excepción.
- DlQL reproduce todas las llamadas de propiedad y método desde el mensaje a la clase de excepción.
- DlQL elimina el mensaje si el controlador de excepciones completa correctamente la transacción. El controlador de excepciones puede emitir IObjectContext::SetAbort y el mensaje permanecerá en la cola de mensajes fallidos.
Si se produce un error en alguno de los pasos anteriores, el mensaje se deja en la cola de mensajes fallidos de Xact.
Cuando se inicia, DLQL lee cada mensaje en la cola de mensajes fallidos transaccionales de Message Queuing y crea una instancia de la clase de excepción para cada mensaje de componentes en cola. Después de pasar por la cola, espera nuevos mensajes. A continuación, procesa cada nuevo mensaje de cola de mensajes fallidos a medida que llega.
Si necesita intervenir en el proceso descrito aquí o si necesita mover un mensaje dudoso fuera de su cola de reposo final, use la utilidad de mover mensajes. Para obtener más información sobre la utilidad de movimiento de mensajes, consulte Control de errores.
Temas relacionados