Как объединить общие части WSDL и XSD из разных сервисов? - PullRequest
22 голосов
/ 25 марта 2011

Мне приходится взаимодействовать с набором веб-сервисов, каждый из которых поставляется со своими WSDL и XSD.XSD иногда объединяются в один файл, иногда распределяются по нескольким файлам (20-30).Однако по своему опыту я знаю, что большая часть структуры сообщений и данных имеют большое общее подмножество, возможно, только 20% различаются между различными транзакциями.

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

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

Однако это вызываеттребования к памяти адаптера, чтобы пройти через крышу, поскольку каждый сервис загружает свой контекст.Прямо сейчас у меня более 500M памяти, используемой только для адаптера, в котором находятся сервисные клиенты, еще до того, как я начну отправлять запросы и обрабатывать ответы.Хотя я могу без проблем запустить систему, используя текущую ситуацию, это создает ограничения, которые ставят под угрозу развертывание решения;Мой клиент хотел бы значительно сократить это (60% или более), чтобы эта система могла быть установлена ​​вместе с другими без необходимости обновления оборудования.

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

Я не связан с CXF или JAXB, кроме времени, необходимого для перефакторингасистема к другой структуре или привязкам данных.

Заранее благодарю за помощь.

--- EDIT ---

Спасибо, Блейз.Это указывает на особенность JAXB, которая будет полезна: эпизоды.К сожалению, мне все еще нужно извлечь общую базовую часть различных сервисов.Итак, теперь мне нужно средство для извлечения этих общих частей через структурный дифференциал, то есть инструмент сравнения, который бы знал структуру и иерархию типов, описанную XSD, чтобы были установлены надлежащие ссылки для соединения общих секций сспециализированные части.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Если вы хотите немного урезать, альтернативная технология сортировки (в любом фреймворке) может сделать хитрость - отбросьте JAXB и попробуйте JiBX, который был добавлен в последний выпуск CXF, или, может быть, просто StAX.

Поскольку вы хотите сделать что-то немного более индивидуальное, чем обычные сервисы в стиле JAX-Ws / JAXB, вы можете рассмотреть Spring-WS.

Spring-WS дает вам контроль над всеми аспектами стека веб-сервисов. Он может маршрутизировать сообщения различными способами (полезная нагрузка, выражения XPath и т. Д.), И вы можете использовать любую технологию маршалинга / сериализации (Jibx, jDOM, SAX и т. Д.)

Вот таблица, которая иллюстрирует параметры: http://static.springsource.org/spring-ws/sites/2.0/reference/html/server.html#d4e1062

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

Способность направлять сообщения в различные термины «конечные точки» (в Spring-WS) означает, что вы также можете делать такие вещи, как «принимать любое сообщение» на этом интерфейсе (который выглядит как DOM / SAX / и т. Д.), А затем иметь одна большая сортировочная операция там.

Ключевая вещь, которую Spring-WS купит вас здесь, - это выйти из шаблона JAX-WS, сыграть немного вперед, и тогда вы всегда сможете вернуться к JAXB позже, будь то перехватчики, ваш приложения и т. д. В принципе, вы можете сделать то же самое с JAXB DOM Source, но, по моему мнению, стек Spring-WS дает вам наилучший детальный контроль для особых ситуаций, подобных тем, что вы здесь.

0 голосов
/ 16 июня 2011

Лучший трюк - служить статическому wsdl. Просто откройте wsdl, сохраните его, загрузите на сервер и укажите клиенту, чтобы он указывал на статический вместо сгенерированного динамического self.

...