1. Общие сведения
На современных веб-сайтах появляется все больше и больше каналов доступа, и технологии становятся все более продвинутыми, например, WAP, SMS, EMAIL, традиционный Интернет, Socket и т. д. Если включены даже базы данных и LDAP, доступ Если поэтому пространство, которое необходимо расширить в конструкции, должно быть очень большим, чтобы при добавлении новых каналов больше не требовалось модификаций кода или даже изменений кода. Но возможно ли это? Я не думаю, что это возможно, но есть ли способ лучше решить проблему совершенствования этой структуры многоканального доступа
2. Архитектура
?[Рисунок 1]
Как показано на рисунке 1, когда все существующие доступы были использованы, дизайнеры были в восторге. Если речь идет о сборе людей, то эти программы можно писать как угодно, и это обязательно будет работать. , но поддерживать его будет сложнее. Вернемся к вопросу: как добиться более совершенной реализации? На рисунке 2 показано:
[Рисунок 2]
Рисунок 2 выглядит как осьминог с восемью клешнями. Ноги осьминога подключены ко всем каналам доступа соответственно. Основой соединения всех этих каналов является XMLRouter, голова осьминога. Роль маршрутизатора здесь заключается в следующем. Общайтесь по всем каналам и реализуйте преимущества маршрутизации данных и улучшения масштабируемости и гибкости системной архитектуры. Он называется XMLRouter, потому что если XML, гибкий и стандартизированный язык, не используется в качестве среды передачи данных, рабочая нагрузка маршрутизатора также увеличивается в геометрической прогрессии. Определение спецификации XML приведет к будущему расширению.
3. Идеи и шаблоны.
Первоначальная идея XMLRouter возникла на материнской плате компьютера и <
>В шаблоне Builder слот PCI материнской платы компьютера определяет спецификацию PCI. Если производимая вами карта соответствует стандарту PCI, она может работать, когда вы вставляете ее в материнскую плату. Что касается того, как она работает внутри, так оно и есть. . Builder Pattern предлагает разделить сложную конструкцию и реализовать ее шаг за шагом. XMLRouter разделяет эти сложные каналы и выполняет их один за другим.
Идея служб: для связи с маршрутизатором при доступе к ним должен быть определен единый интерфейс.
канал, здесь он называется«
Службы». Пока программа соответствует спецификации «Сервисы», она может получить доступ к маршрутизатору и данным маршрута
. RouterFactory, он будет помещен в очередь при его использовании. Данные передачи, данные приема и возвращаемые данные вызываются из соответствующего маршрутизатора из очереди, и применяется составной режим.
4. Файл конфигурации XML.
XML-файл. Использование маршрутизатора разделено на две части. Первая — это настройка маршрутизатора, например:
Вот цитата: <?xml версия="1.0" ?> <услуги> <!-- Служба базы данных --> <service name="database" type="database" class="com.web.service.DBService"> <соединитель driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://192.168.0.179:1433" user="test" passwd="тест" /> </сервис> <!-- Веб-сервис--> <service name="web" type="web" class="com.web.service.WebService" > <соединитель /> </сервис> … </services> |
Это файл конфигурации маршрутизатора. Узел службы представляет канал, к которому требуется доступ. Узел службы содержит подузел соединителя. Конфигурация подузла различается по типу. база данных, она содержит такие атрибуты, как URL, пользователь, пароль, драйвер и т. д., если это сокет, он содержит такие атрибуты, как порт и максимальный поток. Значения атрибутов можно настроить в соответствии с вашим собственным определением.
Другой тип файлаXML
— это файл данных транзакции XML, который используется для передачи данных во всех службах. Каждая служба содержит свой собственный файл XML, например webtrans.xml, имеет следующий формат:
Вот цитата: <?xml версия="1.0" ?> <транзакция> <trans name="addDoc" service="database" метод="insert"> <property name="createtime" type="timestamp"/> <property name="creatorid" type="long"/> <property name="doctypeid" type="int"/> <property name="docstatusid" type="int"/> </транс> </transaction> |
Соответствующий формат dbtrans.xml следующий:
Вот цитата: <trans name="addDoc" table="TDOC_DOCS" метод="insert"> <primarykey name="docid" /> <набор> <property name="createtime" type="timestamp"/> <property name="creatorid" type="long"/> <property name="doctypeid" type="int"/> <property name="docstatusid" type="int"/> </set> </транс> |
Остальной XML можно настроить по таким правилам
. 5. Техническая реализация
RouterFactory.
Вот цитата: пакет com.web.router; импортировать com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable; |
Ниже приведен справочный фрагмент: /** * Классы создаются и очищаются маршрутизатором. */ публичный класс RouterFactory { /** * Фронт дерева сохраняется в маршрутизаторе. */ частная статическая java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * Дерево, сохраненное маршрутизатором. */ частная статическая java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * Дерево, сохраненное маршрутизатором */ частный статический java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null; /** * Возвращен XMLRouter */ экземпляр публичного статического XMLRouter = null; /** *Определение маршрутизатора */ общественный статический RouterDefine routerdefine = null; /** * Идентификатор маршрутизатора */ общественный статический длинный маршрутиндекс = 0; /** * @roseuid 3F169C21027C */ общественный RouterFactory() { } /** * Инициализация хеш-таблицы и вектора */ public static void initFactory() выдает исключение java/lang/Exception.java.html" target="_blank">Exception { QueuePairFront = новый java/util/Hashtable.java.html" target="_blank">Hashtable(); QueuePairBack = новый java/util/Hashtable.java.html" target="_blank">Hashtable(); QueueRouter = новый java/util/Hashtable.java.html" target="_blank">Hashtable(); initRouteDefine(); } /** * Инициализировать настройки маршрута * */ Private static void initRouteDefine() выдает исключение java/lang/Exception.java.html" target="_blank">Exception { если (routerdefine == ноль) routerdefine = новый RouterDefine (); routerdefine.loadRouterDef(); } /** * Экземпляр возврата * @return com.web.router.XMLRouter */ public static XMLRouter getInstance (длинный индекс) выдает RouterException { return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index)); } /** * Создать экземпляр XMLRouter * @return com.web.router.XMLRouter * @roseuid 3F1618A103BC */ public static XMLRouter popInstance() выдает RouterException { Индекс маршрута++; экземпляр = новый XMLRouter (routeIndex); setDefine (экземпляр); QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex), экземпляр); вернуть экземпляр; } /** * Очистить хэш-таблицу, вектор и т. д. * @roseuid 3F1618B203C1 */ Private static void freeResource() выдает исключение java/lang/Exception.java.html" target="_blank">Exception { QueuePairFront.clear(); QueuePairBack.clear(); QueueRouter.clear(); QueuePairFront = QueuePairBack = QueueRouter = null; } /** * Очистить экземпляр * @param instanceID * @throwsException */ public static void removeInstance(экземпляр XMLRouter) выдает исключение java/lang/Exception.java.html" target="_blank">Exception { экземпляр.очистить(); QueueRouter.remove(new java/lang/Long.java.html" target="_blank">Long(instance.getIndex())); } /** * Метод имеет значениеNull. * @return логическое значение */ общедоступное статическое логическое значение isNull() { … вернуть ложь; } } |
Вот цитата: пакет com.web.router; импортировать com.web.platform.Exception.RouterException; импортировать com.web.common.*; импортировать java.util.*; импортировать java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank">Метод; импортировать java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">Конструктор; /** * @author Кели * @версия 0.0.1 * Ключ от платформы, класс маршрутизации, каждый Роутер будет читать из RouterFactory * Дерево Front, Back, RouteIndex, хранящееся в Router, предназначено для маршрутизации. * Примененные объекты можно удалить позже. * Маршрутизатор может реализовывать синхронные и асинхронные функции. */ общедоступный класс XMLRouter { /** * Фронт дерева сохраняется в маршрутизаторе. */ частная статическая java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * Дерево, сохраненное маршрутизатором. */ частная статическая java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * Индексный номер этого роутера */ частный длинный маршрутиндекс = 0; /** *Настройки роутера*/ частный RouterDefine define = null; /** * Используется для определения начальной точки маршрута */ частный java/lang/String.java.html" target="_blank">String action = ""; /** *Эта переменная используется только для применения нового класса в методе маршрута. */ частный java/lang/String.java.html" target="_blank">String classname = ""; /** */ общедоступный XMLRouter (длинный индекс) { RouteIndex = индекс; } /** * Маршрутизация * Исключение @throws * @roseuid 3F1616BD0186 */ public void маршрутизация (Env env) выдает RouterException, java/lang/Exception.java.html" target="_blank">Exception { /*Если это отправная точка*/ если( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) ) { … } /*Если это точка возврата*/ иначе, если( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) ) { … } /*Иначе это ошибка*/ еще throw new RouterException("Ошибка действия Set Router."); } /** * Прочтите идентификационный номер этого маршрутизатора. * @return длинный */ публичный длинный getIndex() { вернуть индекс маршрута; } /** * Очистить все объекты. * @throws RouterException */ public voidclear() выдает RouterException { QueuePairFront.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); QueuePairBack.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); /*Переработка системы*/ java/lang/System.java.html" target="_blank">System.runFinalization(); } /** * Установите настройки этого маршрутизатора. * @param защита * @throws RouterException */ public void setDefine (RouterDefine def) выдает RouterException { определить = защита; } /** * Установите значение действия * @param actionName * @throws RouterException */ public void setAction( java/lang/String.java.html" target="_blank">String actionName ) { действие = ИмяДействия; } } |
Класс обслуживания
Вот цитата: пакет com.web.common; импортировать com.web.platform.Exception.RouterException; /** * Родительский класс Service, абстрактный */ публичный абстрактный класс RouteService { /** */ publicRouteService() { } /** * Метод RouteTo является отправной точкой транзакции. * @param окружение * @throws RouterException */ public Abstract void Routeto(Env env) выдает RouterException; /** *routeBack, конечная точка транзакции, * @param окружение * @throws RouterException */ public Abstract void Routeback (Env env) выдает RouterException; /** * Метод RouteAccept является точкой приема транзакции и функцией приема Routeto. *routeaccept — основная функция обработки объектов пассивных транзакций * @param env * @throws RouterException */ public Abstract void RouteAccept(Env env) выдает RouterException; /** * Метод маршрутизации — это функция внешнего интерфейса службы * @throws RouterException */ public Abstract void Router() выдает RouterException; |
Далее вам необходимо реализовать все классы служб, которые здесь не будут представлены.
6. Объясните, что
этот маршрутизатор пока может реализовывать только синхронные транзакции и на данный момент не поддерживает асинхронные транзакции
.Однако, поскольку Маршрутизатор спроектирован с использованием Композитной модели, реализация асинхронных транзакций также может быть расширена, поэтому подробный анализ здесь проводиться не будет.