Поделиться через


Постоянные сбои на стороне клиента

В некоторых случаях очередь сообщений может переместить сообщение в целевую очередь. Например, если элементы управления доступом к очереди не позволяют перемещать сообщение с клиента на сервер, сообщение обижается в очередь недоставленных сообщений на стороне клиента. При этом служба компонентов COM+ позволяет связать класс исключений с компонентом. Чтобы связать класс исключений с компонентом, перейдите на вкладку "Дополнительно " на странице свойств компонента средства администрирования служб компонентов. Вы также можете программно связать класс исключений с помощью атрибута компонента каталога ExceptionClass для функций COM+ Администратор istrative.

Класс исключений определяется как ProgID или CLSID компонента, реализующего IPlaybackControl. Служба очередей компонентов содержит монитор очереди недоставленных писем, который сканирует очередь недоставленных писем Xact. Если в очереди есть сообщение, монитор очереди недоставленных писем создает экземпляр обработчика исключений, связанного с целевым компонентом, и вызывает IPlaybackControl::FinalClientRetry, указывая на то, что на стороне клиента возникла неустранимая ошибка.

Помимо IPlaybackControl обработчик исключений должен реализовать тот же набор интерфейсов, что и серверный компонент, для которого он обрабатывает исключения. При вызове IPlaybackControl::FinalClientRetry время выполнения компонентов очереди воспроизводит сообщение об ошибке обработчику исключений. Это позволяет обработчику исключений реализовать альтернативное поведение для сообщений, которые не могут быть перемещены на сервер, например путем создания компенсирующей транзакции.

Если обработчик исключений завершает все вызовы метода, воспроизводимые обратно, сообщение удаляется из очереди недоставленных писем Xact и закрывается. Однако если обработчик исключений прерывает сообщение, возвращая состояние сбоя из одного из вызовов метода, сообщение возвращается в очередь недоставленных букв Xact. В следующей последовательности событий показано, как обрабатываются исключения на стороне клиента:

  1. Очередь сообщений не доставляет сообщение серверу и помещает сообщение в очередь недоставленных писем Xact.
  2. Прослушиватель очереди недоставленных писем (DLQL) находит сообщение в очереди недоставленных писем Xact.
  3. DLQL извлекает целевой компонент CLSID из сообщения и проверка для класса исключений.
  4. DLQL создает экземпляр класса исключений.
  5. Запросы DLQL для IPlaybackControl для класса исключений.
  6. DLQL вызывает метод IPlaybackControl::FinalClientRetry в классе исключений.
  7. DLQL воспроизводит все вызовы свойств и методов из сообщения в класс исключений.
  8. DLQL удаляет сообщение, если обработчик исключений успешно завершает транзакцию. Обработчик исключений может выдавать IObjectContext::SetAbort, и сообщение останется в очереди недоставленных писем.

Если произошел сбой любого из предыдущих шагов, сообщение остается в очереди недоставленных писем Xact.

При запуске DLQL считывает каждое сообщение в очереди недоставленных сообщений очереди транзакций и создает экземпляр класса исключений для каждого сообщения с очередными компонентами. После передачи через очередь он ожидает новых сообщений. Затем он обрабатывает каждое новое сообщение очереди недоставленных писем по мере поступления.

Если вам нужно вмешаться в процесс, описанный здесь, или если вам нужно переместить отравляющее сообщение из окончательной очереди отдыха, используйте программу перемещения сообщений. Дополнительные сведения о служебной программе перемещения сообщений см. в разделе "Обработка ошибок".

Ошибки на стороне клиента

Ошибки на стороне сервера