(Java) Как я могу передать проверенные Схемой XML-документы в качестве параметров между распределенными компонентами (например, веб-службами или сокетами)? - PullRequest
2 голосов
/ 25 августа 2010

Вот описание сценария, и я был бы признателен также за любые комментарии по используемому подходу

Ядром моего приложения является набор веб-сервисов, поддерживаемых базой данных P2P.Один сервис принимает простую запись на основе XML (я разработал для нее общую схему).Служба обрабатывает эти данные (главным образом, создавая ключи на основе определенных критериев) и передает исходные данные вместе с созданными ключами в прослушивающий SocketServer в одном из прослушивающих P2P-узлов.Этот ключ, пара данных направляется на соответствующий узел, который хранит данные (связанные с ключом в качестве идентификатора) в базе данных XML.

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

Например, если исходная запись, отправленная первой службе, была value1 </ attr1> value2 </ attr2> (список атрибутов вместе с некоторыми другими метаданными, предусмотренными схемой), тогда вторая служба должна извлечь эту запись, если полученный запрос был value2 </ attr2>

(Позже я мог бы подумать об использовании более сложных запросов XPath или XQuery, поскольку базовая база данных XML позволяет вместо точных совпадений значений здесь, но это не важно на данном этапе. Есть также третий сервис, над которым я работаюно это зависит от получения первых двух в правильной форме первым)

Итак, мои вопросы:

1) Какой тип данных я должен использовать в качестве параметров веб-служб?Как использовать мою схему для этого использования?Я рассматривал различные структуры связывания XML (особенно JAXB и SDO) для этого, но не знал, как поступить.

2) Как я могу улучшить две службы (назвать их хранить и искать) для использования динамически создаваемыхшаблоны на основе оригинальной общей схемы?Служба будет по-прежнему принимать документы основного типа схемы, но имеет внутренний список атрибутов, основанный на шаблоне, скажем, что для template1 требуются только значения ints, а для template2 требуются (float) и (string).Текущий прототип на основе JSP создает этот шаблон вручную, но в виде XML-документа, который собирается вручную (тэги <> разбросаны по тексту), и нет никакой проверки типов, поэтому я подумал, что могу добиться большего!

3) Можно ли создать быстрый прототип веб-приложения для простого доступа к этой системе (опять же, используя схему (и шаблоны) для редактирования соответствующих структур сообщений XML? Что я ищу, так это (человек), чтобы выбрать шаблон, а затем просто «заполнить пробелы» и отправить, нет необходимости в каких-либо причудливых взглядах.

4) Могу ли я или как я также могу использовать этот тип сообщения XML для общениячерез сокеты?

5) Имеет ли значение, развертываю ли я сервисы как EJB без сохранения состояния или нет?Нужно ли, чтобы они были EJB-компонентами или сервлетов было бы более чем достаточно?

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

Мое первоначальное расследование привело меня к рассмотрению JAXB, но он поддерживает только статическую типизацию (не может динамически создавать схему / типы во время выполнения, которые я хочу сохранить для дальнейшего использования). Таким образом, я столкнулся с SDO, который имеет как динамическую, так и статическую типизацию. Проблема только в том, что не хватает сообщества и / или примеров использования этого подхода, поэтому он кажется рискованным (примеры реализаций Apache Tuscany и Eclipselink очень скудны, и я не смог найти полных примеров, которые не старше 5 лет (например, this http://www.ibm.com/developerworks/java/library/j-sdo/), а также относится к сценарию использования SDO в XML (большинство, похоже, фокусируется на реляционном использовании SDO).

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

Любой комментарий или подсказка действительно приветствуются.

trfndr

РЕДАКТИРОВАТЬ

Я забыл одну вещь: как служба поиска вернет результаты? Поскольку он открывает соединение с клиентским сокетом, невозможно получить какие-либо результаты синхронно. Текущая реализация решает эту проблему, когда клиент службы открывает сокет прослушивания на случайном порту и помещает эту контактную информацию в документ запроса. После того как поисковый веб-сервис отправляет запрос в p2p-часть, он завершает свою работу. P2p отправляет результаты в виде вызова WS в другую службу, которая отправляет их обратно в сокет клиента службы. Мне не очень нравится этот подход, есть ли более элегантное решение?

1 Ответ

0 голосов
/ 01 сентября 2010

Я возглавляю реализации EclipseLink JAXB и SDO и представляю Oracle по этим спецификациям, так что, надеюсь, я смогу вам помочь. Этот вопрос очень похож на доклад, который я даю на JavaOne в сентябре.

1) Какой тип данных я должен использовать в качестве параметры веб-сервисов? Как использовать мою схему для этого использования? я рассматривал различные XML-привязки рамки (особенно JAXB и SDO) для этого, но не знал, как продолжить.

Это зависит от того, какую платформу веб-служб вы используете. JAXB намного проще в использовании с JAX-WS, и хотя JAXB все еще проще в использовании с JAX-RS SDO, возможная альтернатива.

2) Как я могу улучшить две услуги (назовите их магазин и поиск), чтобы использовать динамически созданные шаблоны на основе оригинальная общая схема? служба все равно будет принимать документы основного типа схемы, но имеет внутренний список атрибутов на основе Скажи, что template1 требует только чьи значения являются целыми числами, в то время как template2 требуют (плавать) и (строка). текущий прототип на основе JSP вручную создает этот шаблон, но в виде XML документ, который собран вручную (теги <> разбросаны по тексту) и там нет проверки типа, что так всегда думал, что смогу сделать лучше!

Я не на 100% понимаю, что вы здесь имеете в виду, но может быть полезно следующее:

3) Можно ли создать быстрый прототип веб-приложения для простого доступа к эта система (опять же с помощью схемы (и шаблоны) для редактирования соответствующих Структуры сообщений XML? Что я ищет для (человека) пользователя выберите шаблон и затем просто "заполните в пробелах "и представить, нет необходимости любой причудливый вид.

JAX-RS - хорошая среда для создания быстрых прототипов. Ниже приведен пример, который я создал:

4) Могу ли я или как я также могу использовать это Тип сообщения XML для общения через розетки?

Я предпочитаю фреймворки, такие как JAX-RS, которые взаимодействуют по протоколу HTTP.

5) Имеет ли значение, если я разверну сервисы как EJB без сохранения состояния или нет? Делать Мне нужно, чтобы они были EJB или сервлетами будет более чем достаточно?

Я предпочитаю использовать сессионный компонент EJB для службы. Если вы взаимодействуете с базой данных, вы можете использовать Java Transaction API (JTA) для управления транзакциями вашей базы данных.

SDO

EclipseLink - эталонная реализация SDO 2.1.1 (JSR-235) . У нас есть несколько примеров, размещенных ниже. Если вы ищете, как сделать что-то конкретное, я постараюсь опубликовать соответствующий пример.

JAXB

JAXB статичен. Это также более популярно, чем SDO. Признавая это в EclipseLink, мы реализовали динамическую функцию JAXB. Это дает вам динамический аспект SDO с уклоном JAXB.

РЕДАКТИРОВАТЬ # 1

Поскольку вы имеете дело с JAX-WS и ваша модель почти полностью динамична, я думаю, вам следует вообще пропустить привязку JAXB. По следующей ссылке см. Раздел «Отключение привязки данных»

Это даст нам тело сообщения в виде объекта javax.xml.transform.Source. Нам нужно будет обработать XML на основе динамических шаблонов. SDO был бы хорошим выбором здесь. Вы можете постоянно добавлять новые типы в HelperContext, используя схемы XML.

helperContext.getXSDHelper().define(schema1, null);
helperContext.getXSDHelper().define(schema2, null);

Вы сможете разархивировать источник из веб-службы следующим образом:

XMLDocument doc = helperContext.getXMLHelper().load(source, null, null);
DataObject rootDataObject = doc.getRootObject();
String someValue = rootDataObject.getString("attr3/childAttr/anotherChildAttr");

Вы также сможете использовать XMLHelper для преобразования ваших объектов в XML при вызове другой службы.

...