Ошибки на стороне сервера
Прослушиватель и игрок работают вместе, чтобы справиться с подозрительными сообщениями. Если транзакция, которая выполняется обратно, завершается сбоем, очередь сообщений перемещает входное сообщение обратно в входную очередь. Проигрыватель прерывает транзакцию, если она получает сбой HRESULT из компонента сервера или перехватывает исключение. Если проблема сохраняется, прослушиватель может непрерывно цикливать в следующем шаблоне:
- Отменяет сообщение
- Создает экземпляр объекта
- Страдает откатом
- Помещает сообщение обратно в начало очереди
Служба очередей компонентов обрабатывает этот сбой с помощью ряда очередей повторных попыток для конкретного приложения. Создается при установке компонента семь очередей для каждого приложения, как показано ниже.
Обычная очередь входных данных. Имя этой очереди — это имя приложения COM+. Это общедоступная очередь очереди сообщений.
Первая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из обычной входной очереди. Сообщения в этой очереди обрабатываются через одну минуту. Перед перемещением в обратную сторону второй очереди повторных попыток можно выполнить три раза. Эта очередь называется ApplicationName_0. Эта очередь представляет собой частную очередь очереди сообщений.
Вторая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из первой очереди повторных попыток. Сообщения в этой очереди обрабатываются через две минуты. Перед перемещением в обратную сторону третьей очереди повторных попыток можно выполнить три раза. Эта очередь называется ApplicationName_1. Эта очередь представляет собой частную очередь очереди сообщений.
Третья очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из второй очереди повторных попыток. Сообщения в этой очереди обрабатываются через четыре минуты. Перед перемещением в спину четвертой очереди повторных попыток можно получить три раза в эту очередь. Эта очередь называется ApplicationName_2. Эта очередь представляет собой частную очередь очереди сообщений.
Четвертая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из третьей очереди повторных попыток. Сообщения в этой очереди обрабатываются через восемь минут. Перед перемещением в пятую очередь можно повторно выполнить три раза в этой очереди. Эта очередь называется ApplicationName_3. Эта очередь представляет собой частную очередь очереди сообщений.
Пятая очередь повторных попыток. Сообщения перемещаются здесь, если транзакция неоднократно завершается ошибкой при обработке сообщений из четвертой очереди повторных попыток. Сообщения в этой очереди обрабатываются через шестнадцать минут. Перед перемещением в окончательную очередь можно повторно выполнить три раза в этой очереди. Эта очередь называется ApplicationName_4. Это частная очередь очереди очередей сообщений.
Окончательная очередь отдыха для конкретного приложения. Сообщения перемещаются здесь, если транзакция неоднократно прерывается при попытке в пятой очереди повторных попыток. Эта очередь называется ApplicationName_DeadQueue. Это частная очередь очереди очередей сообщений. Последняя очередь отдыха не обслуживается прослушивателем очереди. Сообщения остаются здесь, пока они не будут вручную перемещены (возможно, программой перемещения сообщений в очереди) или очищаются Обозреватель очереди сообщений.
Сообщения, которые не доступны для воспроизведения, так как ясно, что каждая попытка повторных попыток завершится ошибкой, может быть перемещена непосредственно в очередь окончательного отдыха приложения, не используя все уровни повторных попыток.
Игрок выдает событие COM+, чтобы уведомить заинтересованных сторон о том, что сообщения не могут быть воспроизведены. События COM+ выдаются в следующих ситуациях:
- При прерывании транзакции
- При перемещении сообщения из одной очереди в другую
- Когда сообщение помещается в окончательную очередь отдыха
Перед переходом из одной очереди в другую можно изменить сообщения. Механизм безопасности компонентов COM+ позволяет переместить сообщение в очереди повторных попыток, а затем повторно вставить в начальную очередь входных данных приложения. Дополнительные сведения о безопасности очередей компонентов см. в разделе "Безопасность компонентов очереди".
Очереди повторных попыток создаются вместе с основной очередью приложений, когда приложение помечается как помечено средством администрирования служб компонентов или с помощью функций COM+ Администратор istrative SDK. Служба компонентов очереди обеспечивает гибкость в механизме повторных попыток, позволяя удалять очереди повторных попыток. Например, если удаляются все очереди повторных попыток, сообщение, которое постоянно прерывается, будет перемещено непосредственно из очереди приложения в очередь окончательного отдыха приложения. Удалив одну или несколько очередей повторных попыток, можно уменьшить количество и длину повторных попыток. Если очереди удаляются из последовательности повторных попыток, время оставшихся очередей соответствует позиции в последовательности очередей повторных попыток. Например, если удалить очередь повторных попыток ApplicationName_1, ApplicationName_2 и ApplicationName_3, сообщения в ApplicationName_4 будут обрабатываться, как если бы очередь была второй очередью повторных попыток.
Механизм повторных попыток предназначен для завершения сообщения, если это возможно. В некоторых случаях сообщение может оказаться невозможным. Например, клиент может попытаться снять деньги с счета, у которой недостаточно средств. В этих обстоятельствах можно обрабатывать ошибку несколькими способами, включая следующие:
- Создание диагностики и выдача предупреждения
- Создание компенсирующей транзакции
- Пропустить проблему и закрыть сообщение
Как и постоянные сбои на стороне клиента, служба компонентов очереди позволяет связать класс исключений с компонентом. Класс исключений связан с компонентом с помощью вкладки "Дополнительно" на странице свойств компонента средства администрирования служб компонентов или с помощью com+ Администратор istrative функций. Класс исключений позволяет разработчику управлять после получения сообщения и перед перемещением этого сообщения в очередь окончательного отдыха приложения. Дополнительные сведения о классе исключений см. в разделе "Постоянные сбои на стороне клиента".
Ниже приведена последовательность событий для обработки исключений на стороне сервера:
- Сообщение перемещается через доступные очереди повторных попыток для конкретного приложения.
- Последняя повторная попытка в последней очереди повторных попыток завершается ошибкой.
- Время выполнения службы очередных компонентов извлекает целевой компонент из сообщения и проверка для класса исключений.
- Время выполнения создает экземпляр класса исключений.
- Время выполнения запрашивает IPlaybackControl в классе исключений.
- Во время выполнения вызывается IPlaybackControl::FinalServerRetry в классе исключений.
- Время выполнения воспроизводит все вызовы свойств и методов из сообщения в класс исключений.
- Если шаги 4–6 не выполнены, время выполнения перемещает сообщение в очередь окончательного отдыха приложения.
Если вам нужно вмешаться в процесс, описанный выше, или необходимо переместить отравляющее сообщение из окончательной очереди отдыха, используйте программу перемещения сообщений. Дополнительные сведения о служебной программе перемещения сообщений см. в разделе "Обработка ошибок".
См. также