Поддержка сайта

Высокие позиции в поисковой системе, на прямую зависят от развития вашего сайта.

Продвижение сайтов

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

Создание сайтов

Мы делаем сайты быстро, недорого и профессионально. От работы с нами, у вас останутся только положительные эмоции.

Перемещение заказа по конвейеру

1. Прежде всего нужно добавить в WroxCommerce возможность создания экземпляров и конфигурирования экземпляра объекта OrderProcessor. Введите в объект Visit:

‘ StartOrderProcessor создает новый объект обработки заказа Public Function StartOrderProcessor() As Object

‘ создаем и инициализируем

Set StartOrderProcessor = CreateObject("WroxProcessor.OrderProcessor") StartOrderProcessor.Configure mstrDBString, mstrMailDomain, Me

End Function

Обратите внимание на передачу соединения с базой данных и домена почтового сервера в новый процессор через метод Configure.

2. Изменим методРІасеОгсІег, существующий внутри объекта Orders. При вызове в WroxProcessor.OrderProcessor серверу MTS предоставляется возможность запуска транзакции. Мы указали для OrderProcessor создание новой транзакции (установив свойство MTSTransactionMode в значение RequiresNewTransaction), поэтому MTS создаст транзакцию сразу после вызова метода Configure объекта OrderProcessor.

Однако пока ничего не сделано для вызова метода startOrderProcessor, который добавлен в объект WroxCommerce .Visit, поэтому не будет запрошен метод Configure объекта OrderProcessor и не будет создана транзакция. Более того, не запрашивается никаких действий конвейера!

Необходимо изменить вызов PlaceOrder объекта Orders. Придется перебрать в цикле все части заказа, создавая каждый раз новый экземпляр объекта OrderProcess и, следовательно, формируя новую транзакцию для каждой части заказа. Затем нужно будет вызвать метод Go в OrderProcessor.

Итак, измените метод PlaceOrder объекта WroxCommerce. Orders следующим образом:

 Перемещение заказа по конвейеру

3. Вернемся в WroxProcessor и посмотрим на работающий коннектор. Щелчок мыши на кнопке Place Order страницы сайта приведет к тому, что метод PlaceOrder объекта Order создаст экземпляр объекта OrderProcessor для каждой части транзакции и вызовет метод Go.

Метод Go выясняет текущее состояние заказа и по этим данным предпринимает определенное действие. Пока с заказом ничего не происходит, известно лишь, как найти и вызвать первый коннектор.

Добавьте в OrderProcessor:

 Перемещение заказа по конвейеру

Описание работы

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

 Перемещение заказа по конвейеру

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

При обсуждении записи в журнал аудита мы отметили, что следует перехватывать как — можно больше ошибок. Например, если покупатель должен был ввести фамилию, а соответствующее поле в базе данных осталось пустым, нужно предусмотреть способ распознавания и управления такой ситуацией, а не надеяться на стандартный обработчик ошибок VB, который будет действовать непредсказуемым образом.

Мы решили, что VB будет уведомлять нас через RecordError и завершать транзак- I цию. Для обработки всех возможных исключительных ситуаций мы используем SetAbort, управляющий действительно непредсказуемыми ситуациями, и SetComplete — во всех остальных случаях.

Тестирование кода

Для проверки работы кода поместите точку останова в строку: If ObjectContext.IslnTransaction = True

Затем запустите проекты VB (WroxCommerce и WroxProcessor) и проект Visual InterDev. Выполните размещение заказа на сайте. По нажатию кнопки Place Order проект VB остановится, после чего можно будет исследовать окружение транзакции.

Откройте окно Immediate среды VB и введите: ?Obj ectContext.IslnTransaction

Этот код спрашивает у MTS, работает ли транзакция. Должно быть возвращено значение True. Можно провести двойную проверку с помощью MTS Explorer дня исследования текущей исполняемой транзакции. Объект Transaction Statistics управляющего дерева покажет снимок текущей исполняемой транзакции.

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

Если попытаться скомпилировать DLL в тот же файл, что и раньше, то, скорее всего, этот файл будет блокирован, поскольку он уже открыт web-сервером. Будет выдано сообщение об ошибке: Permission Denied (отсутствуют полномочия).

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

Перемещение заказа по конвейеру 

Итак, для остановки службы пользователи NT должны применить специальный командный файл. В операционной системе NT web-сервер является административной службой, к которой подключаются остальные службы Интернета. Если остановить службу web-сервера (ее техническое название — World Wide Web Publishing Service), объекты останутся загруженными в память, поскольку именно так ведут себя объекты административной службы.

□ В редакторе Блокнот введите первую строку файла:

NET STOP IISADMIN

□ Это позволит остановить административную службу IIS и все связанные с ней службы. В Windows NT Server к таким службам относятся Microsoft SMTP Service, FTP Publishing Service и World Wide Web Publishing Service. Пользователи Windows NT Workstation будут иметь дело только со службой web-публикаций.

□ После этого нужно перезапустить зависимые службы. Когда стартует первая зависимая служба, административная служба запустится автоматически. Добавьте строку:

NET START W3SVC

□ При работе в Windows NT Workstation этого достаточно, поскольку в системе нет других зависимых служб, но пользователям Windows NT Server придется добавить:

NET START MSFTPSVC NET START SMTPSVC

□ Сохраните полученный пакетный файл под именем RESTART. ВАТ.

□ При запуске пакетного файла появится запрос на подтверждение остановки всех зависимых служб. Введите Y и нажмите клавишу Enter. Сначала остановятся зависимые службы, а затем административная, после чего будет снята блокировка DLL, и можно будет заново компилировать эту библиотеку.

Далее следует перезапустить зависимые службы, при этом к своей работе приступит и административная служба.

Скомпилируйте DLL. Если опять появится сообщение об ошибке Permission Denied, запустите RESTART.BAT и попробуйте еще раз. Если и в этом случае система не подчинится, закройте (сохранив открытые в этой среде проекты) и перезапустите VB, а затем перекомпилируйте DLL.

Даже если не используется Visual InterDev, приходится закрывать и запускать заново Visual Basic перед повторной компиляцией DLL.

Проверив, что новый объект OrderProcessor вызывается из MTS и что новая транзакция создается, перейдем к выбору исполняемого в данный момент коннектора конвейера.

Выбор коннектора

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

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

Выше рассматривались возможности повышения гибкости конвейера за счет добавления, удаления и замены коннекторов. Такие функции удобно реализовать через значение поля status. Например, значение Status равное 10 может означать, что нужно направить заказ на склад и переключиться на другой коннектор, который пошлет заказ непосредственно поставщику. Изменим метод Go, чтобы он выполнял соответствующие действия.

Реализация выбора коннектора

1. Измените метод Go, добавив в него код:

 

 Перемещение заказа по конвейеру

Перемещение заказа по конвейеру

Перемещение заказа по конвейеру

 

4. Запустите полученный код приложения (как всегда, сначала запустите оба проекта VB и проект Visual InterDev) и пройдите процедуру продажи. В результате в журнал аудита должны попасть две строки. Для их просмотра перейдите в SQL Server Enterprise Manager и откройте таблицу Audit:

 Перемещение заказа по конвейеру

Первая строка отмечает запуск коннектора PipelineNotifyOwner, а вторая указывает на неудачу его исполнения (это связано с тем, что мы не запросили у коннектора никаких действий).

Описание работы

Основная цель внесенного в метод Go кода состоит в определении необходимого для I исполнения коннектора. Заметьте, что в создании коннектора PipelineNotifyOwner I используется тип данных локальной переменной Connector с целью указания на I применение общего интерфейса IConnector, а не специализированного интерфейса I PipelineNotifyOwner. В дальнейшем мы будем считать, что любой объект коннекто- I ра конвейера создается таким же образом.

 Перемещение заказа по конвейеру

Кроме того, метод AddAudit должен запрашивать у поддерживающего IConnector объекта возвращение его имени и идентификатора.

Интересно, что коннектор способен сообщить процессору об успехе действий, что позволяет автоматически переключать работу на следующий коннектор конвейера. Переменная RunNextConnector получает значение True, но действует оно только, когда метод Process возвращает результат True. В этом случае производится повторный вызов метода Go:

 Перемещение заказа по конвейеру

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

При работе внутри транзакции SQL Server разрешает создавать и использовать только один запрос в каждый момент времени, т. е. открыв первый запрос, нельзя открыть второй, пока не будет закрыт первый. Необходимо тщательно писать код, следя за тем, что в любой момент времени может существовать только одно соединение с базой данных. Нельзя вызывать AddAudit, когда открыт запрос, иначе метод AddAudit выдаст ошибку. Это одна из основных причин для запрещения доступа к объектной модели WroxCommerce из процессора заказов. До настоящего момента модель WroxCommerce не следовала этому строгому правилу.

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

Читайте так же:
Not found

Нам доверяют

Интернет магазин