Подтвердить что ты не робот

Как объединить общие части WSDL и XSD из разных сервисов?

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

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

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

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

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

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

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

--- EDIT ---

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

4b9b3361

Ответ 1

Если вы хотите немного обрезать, альтернативная технология маршаллинга (в любых рамках) может сделать 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 marshall прямо на месте.

Возможность маршрутизации сообщений на разные терминалы (в терминах Spring -WS) означает, что вы также можете делать такие вещи, как "принимать любые сообщения" на этом одном интерфейсе (который выглядит как DOM/SAX/etc) и то там есть одна большая сортировочная операция.

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

Ответ 2

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