En

JazzTeam Software Development Company

Agile Java Development

Мануал по использованию DataSense

DataSense - это инструмент, который позволяет использовать метаданные сообщений для облегчения дизайна приложения. Сообщения в Mule - это данные, которые проходят через компоненты flow приложения. В контексте Anypoint Studio метаданные представляют собой информацию о структуре и типах данных, используемых в элементах сообщения (payload, flow variables и т.д).

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

DataSense используется для просмотра информации о сообщении в DataSense Explorer и при трансформации сообщения с помощью компонента Transform Message.

DataSense Explorer

DataSense Explorer представляет собой окно, в котором показывается информация о структуре сообщений, проходящих через Mule flow, и типах данных частей сообщения. Здесь можно увидеть payload, inbound и outbound properties, flow variables и session variables. Для того, чтобы открыть DataSense Explorer, нажмите кнопку, как показано на картинке:

 

 

 

Кликая на различные элементы flow, можно получить информацию о сообщениях в различных точках flow. Например, с помощью DataSense мы узнаем, что после выполнения операции Get Posts коннектор вернет Json с определенной структурой и типами данных:

 

Также информацию о метаданных коннектора можно указать, используя вкладку Metadata.

DataWeave

DataWeave представляет собой язык для описания трансформации сообщения в Mule flow. Для того, чтобы осуществить трансформацию сообщения, необходимо знать структуру сообщения. В этом нам помогает DataSense.

DataWeave может использоваться как часть MEL.

Например:

  1. #[dw("{'payload': payload, 'interface':'CompInvoice'}",
  2. "application/json")]

Также DataWeave может использоваться через компонент Transform Message:

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

Связывая различные элементы сообщения друг с другом, мы получаем код на языке Dataweave:

Если нажать на кнопку Preview, то можно увидеть структуру сообщения после трансформации.

DataWeave поддерживает преобразования следующих типов:

Таким образом, с помощью компонента Transform Message можно сделать преобразование json в xml, csv в json и т.д.

Best practices в использовании DataSense

Наиболее оптимальным является построение flow в следующем порядке:

1. Задать конфигурацию для коннекторов. Конфигурация обычно содержит пароль/логин, адрес к внешнему сервису, различные данные, которые оказывают влияние на работу коннектора в целом. Без этой информации к внешнему сервису нельзя будет подключиться.
Чтобы добавить конфигурацию, нужно нажать кнопку “+” и заполните все необходимые поля.

Это позволит осуществить соединение с внешним сервисом и использовать DataSense для извлечения метаданных с этого сервиса. Также можно задать метаданные через вкладку Metadata коннектора, как это описывалось выше.

2.  Добавить в flow компоненты для обработки сообщений, фильтрации и т. д

3.  Добавить элементы трансформации сообщений DataWeave (компонент                       Transform Message или компоненты, использующие DataWeave Language).

Данную стратегию построения Mule flow можно охарактеризовать как задание структуры flow при помощи различных компонентов и связывание их при помощи DataWeave.

Добавление DataSense при разработке коннектора

Как уже описывалось выше, DataSense дает много преимуществ при дизайне Mule flow. Добавление DataSense не является обязательным шагом при построении коннектора, однако очень рекомендуется его добавлять. Как уже говорилось ранее, DataSense способен существенно упростить использование коннектора на этапе дизайна приложения.

Реализация DataSense состоит из двух этапов:

  1. Конфигурирование извлечения метаданных - получение метаданных из внешнего сервиса (динамический DataSense) или построение строго заданной структуры метаданных (статический DataSense).
  2. Конфигурирование информирования о метаданных - определение способа, с помощью которого Anypoint Studio будет давать пользователю информацию о метаданных при использовании той или иной операции.

Пример:

На первом этапе мы создаем класс, в котором статически (ситуация, когда значения Email и Prescriptions задаются вручную) или динамически (на основе информации с внешнего сервиса) задаем список ключей метаданных (Email и Prescriptions) для этой операции и задаем структуру, которая отображается в DataSense Explorer. Эта структура также может задаваться динамически или статически. В данном примере атрибуты объекта (Location и Subject) были получены динамически с внешнего сервиса. Все остальные поля задавались статически.

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

Структура класса DataSense Resolver

Класс обязательно должен быть помеченным аннотацией @MetaDataCategory, инъектировать коннектор и содержать 2 метода, которые помечены аннотациями @MetaDataKeyRetriever и @MetaDataRetriever. В этом случае метаданные на входе и на выходе коннектора будут одинаковыми (со структурой, определенной в методе, помеченном аннотацией @MetaDataRetriever). В том случае, если на входе коннектора должна быть одна структура метаданных, а на выходе - другая, мы добавляем в класс еще один метод с аннотацией @MetaDataOutputRetriever. Тогда в методе, помеченном аннотацией @MetaDataRetriever, будет задаваться структура метаданных на входе коннектора, а в методе, помеченном аннотацией @MetaDataOutputRetriever, будет задаваться структура метаданных на выходе коннектора.

Как уже описывалось выше, список ключей с метаданными можно задавать статически или динамически в методе, помеченном аннотацией @MetaDataKeyRetriever.

Структура метаданных также может задаваться статически или динамически в методе, помеченном аннотацией @MetaDataRetriever (или @MetaDataOutputRetriever).

Рассмотрим некоторые из этих случаев.

Статический DataSense

Таким образом, в методе, помеченном аннотацией @MetaDataKeyRetriever, мы определили следующие типы ключей: Book с идентификатором Book_id, Author с идентификатором Author_id. Для каждого ключа мы задали структуру метаданных с помощью POJO-классов в методе, помеченном аннотацией @MetaDataRetriever.

Динамический DataSense

 

Данный пример показывает следующие моменты:

  1. Динамическое извлечение ключей метаданных из JSON, который был получен с внешнего сервиса в методе, помеченном аннотацией @MetaDataKeyRetriever.
  2. Построение структуры метаданных на основе JSON в методах, помеченных аннотациями @MetaDataRetriever и @MetaDataOutputRetriever.

Информирование о метаданных

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

В случае использования аннотации на уровне класса для каждого процессора в коннекторе будет использован один и тот же DataSenseResolver.

Возможно одновременное использование аннотации и на уровне классов, и на уровне процессоров. В этом случае процессор, который помечен аннотацией @MetaDataScope, будет использовать класс, заданный в аннотации. Остальные процессоры в этом случае будут использовать DataSenseResolver, который задан в аннотации на уровне класса. Если необходимо, чтобы отдельный процессор не показывал информацию о метаданных, то можно использовать аннотацию @NoMetaData.

Пример процессора с аннотацией @MetaDataScope:

Один из параметров метода помечен аннотацией @MetaDataKeyParam. Параметр, помеченный этой аннотацией, будет принимать одно из значений списка ключей метаданных, который мы получили в методе DataSenseResolver, помеченном аннотацией @MetaDataKeyRetriever.

При помощи этой аннотации также можно сделать так, чтобы информация о метаданных отображалась только на входе или выходе коннектора:

@MetaDataKeyParam(affects = MetaDataKeyParamAffectsType.INPUT)
или
@MetaDataKeyParam(affects = MetaDataKeyParamAffectsType.OUTPUT).

В том случае, если список ключей задан статически только одним значением, процессор можно пометить аннотацией @MetaDataStaticKey(type = "Book"), где type - это тот самый статически заданный ключ. Это может быть применено в том случае, если структура метаданных для коннектора не зависит от выбранного ключа.

Пример:

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

, , ,

Leave a Reply

Your email address will not be published. Required fields are marked *