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


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

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

  • Отменяет сообщение
  • Создает экземпляр объекта
  • Страдает откатом
  • Помещает сообщение обратно в начало очереди

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

  1. Обычная очередь входных данных. Имя этой очереди — это имя приложения COM+. Это общедоступная очередь очереди сообщений.

  2. Первая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из обычной входной очереди. Сообщения в этой очереди обрабатываются через одну минуту. Перед перемещением в обратную сторону второй очереди повторных попыток можно выполнить три раза. Эта очередь называется ApplicationName_0. Эта очередь представляет собой частную очередь очереди сообщений.

  3. Вторая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из первой очереди повторных попыток. Сообщения в этой очереди обрабатываются через две минуты. Перед перемещением в обратную сторону третьей очереди повторных попыток можно выполнить три раза. Эта очередь называется ApplicationName_1. Эта очередь представляет собой частную очередь очереди сообщений.

  4. Третья очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из второй очереди повторных попыток. Сообщения в этой очереди обрабатываются через четыре минуты. Перед перемещением в спину четвертой очереди повторных попыток можно получить три раза в эту очередь. Эта очередь называется ApplicationName_2. Эта очередь представляет собой частную очередь очереди сообщений.

  5. Четвертая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из третьей очереди повторных попыток. Сообщения в этой очереди обрабатываются через восемь минут. Перед перемещением в пятую очередь можно повторно выполнить три раза в этой очереди. Эта очередь называется ApplicationName_3. Эта очередь представляет собой частную очередь очереди сообщений.

  6. Пятая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из четвертой очереди повторных попыток. Сообщения в этой очереди обрабатываются через шестнадцать минут. Перед перемещением в окончательную очередь можно повторно выполнить три раза в этой очереди. Эта очередь называется ApplicationName_4. Это частная очередь очереди очередей сообщений.

  7. Окончательная очередь отдыха для конкретного приложения. Сообщения перемещаются здесь, если транзакция неоднократно прерывается при попытке в пятой очереди повторных попыток. Эта очередь называется ApplicationName_DeadQueue. Это частная очередь очереди очередей сообщений. Последняя очередь отдыха не обслуживается прослушивателем очереди. Сообщения остаются здесь, пока они не будут вручную перемещены (возможно, программой перемещения сообщений в очереди) или очищаются Обозреватель очереди сообщений.

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

Игрок выдает событие COM+, чтобы уведомить заинтересованных сторон о том, что сообщения не могут быть воспроизведены. События COM+ выдаются в следующих ситуациях:

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

Перед переходом из одной очереди в другую можно изменить сообщения. Механизм безопасности компонентов COM+ позволяет переместить сообщение в очереди повторных попыток, а затем повторно вставить в начальную очередь входных данных приложения. Дополнительные сведения о безопасности очередей компонентов см. в разделе "Безопасность компонентов очереди".

Очереди повторных попыток создаются вместе с основной очередью приложений, когда приложение помечается как помечено средством администрирования служб компонентов или с помощью функций COM+ Администратор istrative SDK. Служба компонентов очереди обеспечивает гибкость в механизме повторных попыток, позволяя удалять очереди повторных попыток. Например, если удаляются все очереди повторных попыток, сообщение, которое постоянно прерывается, будет перемещено непосредственно из очереди приложения в очередь окончательного отдыха приложения. Удалив одну или несколько очередей повторных попыток, можно уменьшить количество и длину повторных попыток. Если очереди удаляются из последовательности повторных попыток, время оставшихся очередей соответствует позиции в последовательности очередей повторных попыток. Например, если удалить очередь повторных попыток ApplicationName_1, ApplicationName_2 и ApplicationName_3, сообщения в ApplicationName_4 будут обрабатываться, как если бы очередь была второй очередью повторных попыток.

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

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

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

Ниже приведена последовательность событий для обработки исключений на стороне сервера:

  1. Сообщение перемещается через доступные очереди повторных попыток для конкретного приложения.
  2. Последняя повторная попытка в последней очереди повторных попыток завершается ошибкой.
  3. Время выполнения службы очередных компонентов извлекает целевой компонент из сообщения и проверка для класса исключений.
  4. Время выполнения создает экземпляр класса исключений.
  5. Время выполнения запрашивает IPlaybackControl в классе исключений.
  6. Во время выполнения вызывается IPlaybackControl::FinalServerRetry в классе исключений.
  7. Время выполнения воспроизводит все вызовы свойств и методов из сообщения в класс исключений.
  8. Если шаги 4–6 не выполнены, время выполнения перемещает сообщение в очередь окончательного отдыха приложения.

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

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

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