«1. Обзор

Mule ESB — это упрощенная корпоративная служебная шина на основе Java. Это позволяет разработчикам соединять несколько приложений вместе, обмениваясь данными в разных форматах. Он несет данные в виде сообщения.

ESB предлагают мощные возможности, предоставляя ряд услуг, таких как:

    Создание и размещение службы Посредничество службы Маршрутизация сообщений Преобразование данных у нас есть идея добавить больше приложений в будущем.

ESB также используется для работы с несколькими типами коммуникационных протоколов и когда требуются возможности маршрутизации сообщений.

Давайте создадим пример проекта в Разделе 5, используя AnyPoint Studio, который можно скачать здесь.

2. Структура сообщений Mule

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

Структура сообщения разделена на две части:

Заголовок, содержащий метаданные сообщения Полезная нагрузка, содержащая данные, относящиеся к бизнесу

    Сообщение встроено в объект сообщения. Мы можем получить объект сообщения из контекста. Мы можем изменить его свойства и полезную нагрузку, используя пользовательские компоненты Java и преобразователи внутри потока Mule.

Каждое приложение состоит из одного или нескольких потоков.

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

Например, мы можем получить экземпляр сообщения, используя компонент Java. Этот класс компонента реализует интерфейс Callable из пакета org.mule.api.lifecycle:

3. Свойства и переменные

public Object onCall(MuleEventContext eventContext) throws Exception {
    MuleMessage message = eventContext.getMessage();
    message.setPayload("Message payload is changed here.");
    return message;
}

Метаданные сообщения состоят из свойств. Переменные представляют данные о сообщении. Применение свойств и переменных в жизненном цикле сообщения определяется их областями действия. Свойства могут быть двух типов в зависимости от их области действия: входящие и исходящие.

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

Исходящие свойства могут быть установлены Mule автоматически, или пользователь может установить их через конфигурацию потока. Эти свойства изменчивы. Они становятся входящими свойствами, когда сообщение входит в другой поток после пересечения транспортных барьеров.

Мы можем устанавливать и получать исходящие и входящие свойства соответственно, вызывая соответствующие методы установки и получения в соответствующих областях:

В приложениях можно объявить два типа переменных.

message.setProperty(
  "outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
String inboundProp = (String) message.getInboundProperty("outboundKey");

Одной из них является переменная потока, которая является локальной для потока Mule и доступна в потоке, подпотоках и частных потоках.

Переменные сеанса после объявления становятся доступными во всем приложении.

4. Транспортные барьеры и ссылка на поток

Транспортные барьеры — это HTTP-коннекторы, виртуальные машины, JMS или аналогичные коннекторы, которым требуются пути или конечные точки для маршрутизации сообщений. Переменные потока недоступны через транспортные барьеры, но переменные сеанса доступны в рамках проекта во всех потоках.

Когда нам нужно создать подпоток или частный поток, мы можем обратиться к потоку из родительского или другого потока, используя компонент потока-ref. И переменные потока, и переменные сеанса доступны в подпотоках и частных потоках, на которые ссылается ссылка на поток.

5. Пример проекта

Давайте создадим приложение в Anypoint Studio, содержащее несколько потоков, которые взаимодействуют между собой через входящие и исходящие соединители.

Давайте посмотрим на первый поток:

Мы можем настроить прослушиватель HTTP следующим образом:

Компоненты потока должны находиться внутри тега \u003cflow\u003e. Итак, пример потока с несколькими компонентами:

«

<http:listener-config name="HTTP_Listener_Configuration"
  host="localhost" port="8081" doc:name="HTTP Listener Configuration"/>

«Внутри потока мы предоставляем ссылку на настроенный прослушиватель HTTP. Затем мы сохраняем регистратор для регистрации полезной нагрузки, которую прослушиватель HTTP получает с помощью метода POST.

<flow name="Flow">
    <http:listener 
      config-ref="HTTP_Listener_Configuration" 
      path="/" doc:name="HTTP" 
      allowedMethods="POST"/>
    <logger message="Original 
      paylaod: #[payload]" 
      level="INFO" doc:name="Logger"/>
    <custom-transformer 
      class="com.baeldung.transformer.InitializationTransformer" 
      doc:name="Java"/>
    <logger message="Payload After Initialization: #[payload]" 
      level="INFO" doc:name="Logger"/>
    <set-variable variableName="f1" 
      value="#['Flow Variable 1']" doc:name="F1"/>
    <set-session-variable variableName="s1" 
      value="#['Session variable 1']" doc:name="S1"/>
    <vm:outbound-endpoint exchange-pattern="request-response" 
      path="test" doc:name="VM"/>
</flow>

После этого размещается пользовательский класс преобразования Java, который преобразует полезную нагрузку после получения сообщения:

Класс преобразования должен расширять AbstractMessageTransformer. Мы также устанавливаем исходящее свойство внутри класса.

public Object transformMessage(
  MuleMessage message, 
  String outputEncoding) throws TransformerException {
 
    message.setPayload("Payload is transferred here.");
    message.setProperty(
      "outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
    return message;
}

Теперь мы уже преобразовали полезную нагрузку в объект сообщения и зарегистрировали это в консоли с помощью регистратора. Мы устанавливаем переменную потока и переменную сеанса.

Наконец, мы отправляем нашу полезную нагрузку через исходящий коннектор виртуальной машины. Путь в соединителе виртуальной машины определяет принимающую конечную точку:

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

Компонент Java извлекает исходящие свойства, установленные первым потоком, и возвращает объект, который становится полезной нагрузкой сообщения.

Метод transformMessage() для этой задачи:

Затем переменные потока и сеанса устанавливаются для второго потока. После этого у нас есть ссылка на Flow2 с помощью компонента flow-ref.

public Object transformMessage(
  MuleMessage message, 
  String outputEncoding) throws TransformerException {

    return (String) message.getInboundProperty("outboundKey");
}

В Flow2 мы преобразовали сообщение с помощью класса компонента Java и зарегистрировали его в консоли. Мы также установили переменную потока F3.

После вызова Flow2 с помощью flow-ref, Flow1 будет ждать, пока сообщение будет обработано в Flow2.

Любая переменная потока, установленная в Flow1 и Flow2, будет доступна в обоих потоках, поскольку эти потоки не разделены никакими транспортными барьерами.

Наконец, сообщение отправляется обратно запрашивающей стороне HTTP через виртуальные машины. Мы настроили все виртуальные машины как запрос-ответ.

Мы можем вызвать это приложение из любого клиента REST, разместив в теле любые данные JSON. URL-адрес будет localhost:8081, как настроено в прослушивателе HTTP.

6. Архетип Maven

Мы можем построить проект Mule ESB, используя архетип Mulesoft Maven.

В файл Maven settings.xml нам сначала нужно добавить группу плагинов org.mule.tools:

Затем нам нужно добавить тег профиля, который указывает, где Maven должен искать артефакты Mulesoft: ~ ~~

<pluginGroups>
    <pluginGroup>org.mule.tools</pluginGroup>
</pluginGroups>

Наконец, мы можем создать проект, используя mule-project-archetype:create:

<profile>
    <id>Mule Org</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <id>mulesoft-releases</id>
            <name>MuleSoft Repository</name>
            <url>https://repository-master.mulesoft.org/releases/</url>
            <layout>default</layout>
        </repository>
    </repositories>
</profile>

После настройки нашего проекта мы можем создать развертываемый архив, используя пакет mvn.

mvn mule-project-archetype:create -DartifactId=muleesb -DmuleVersion=3.9.0

После этого мы развернули архив в папку приложений любого автономного сервера Mule.

7. Автономный сервер Mule через репозиторий MuleSoft Maven

Как только что было сказано, для только что созданного проекта требуется автономный сервер Mule.

Если у нас его еще нет, мы можем отредактировать наш pom.xml, чтобы получить его из репозитория MuleSoft Maven:

8. Заключение

<plugin>
    <groupId>org.mule.tools.maven</groupId>
    <artifactId>mule-maven-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
        <deploymentType>standalone</deploymentType>
        <muleVersion>3.9.0</muleVersion>
    </configuration>
    <executions>
        <execution>
            <id>deploy</id>
            <phase>deploy</phase>
            <goals>
                <goal>deploy</goal>
            </goals>
        </execution>
    </executions>
</plugin>

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

Теперь мы можем приступить к созданию приложения ESB с помощью Anypoint Studio для удовлетворения наших различных потребностей.

Как обычно, полный проект можно найти на GitHub.

1. Обзор

Mule ESB — это упрощенная корпоративная служебная шина на основе Java. Это позволяет разработчикам соединять несколько приложений вместе, обмениваясь данными в разных форматах. Он несет данные в виде сообщения.

ESB предлагают мощные возможности, предоставляя ряд услуг, таких как:

Создание и размещение службы Посредничество службы Маршрутизация сообщений Преобразование данных у нас есть идея добавить больше приложений в будущем.

    ESB также используется для работы с несколькими типами коммуникационных протоколов и когда требуются возможности маршрутизации сообщений.

Давайте создадим пример проекта в Разделе 5, используя AnyPoint Studio, который можно скачать здесь.

2. Структура сообщений Mule

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

«Структура сообщения разделена на две части:

Заголовок, который содержит метаданные сообщения Полезная нагрузка, которая содержит бизнес-данные

Сообщение встроено в объект сообщения. Мы можем получить объект сообщения из контекста. Мы можем изменить его свойства и полезную нагрузку, используя пользовательские компоненты Java и преобразователи внутри потока Mule.

    Каждое приложение состоит из одного или нескольких потоков.

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

Например, мы можем получить экземпляр сообщения, используя компонент Java. Этот класс компонента реализует интерфейс Callable из пакета org.mule.api.lifecycle:

3. Свойства и переменные

Метаданные сообщения состоят из свойств. Переменные представляют данные о сообщении. Применение свойств и переменных в жизненном цикле сообщения определяется их областями действия. Свойства могут быть двух типов в зависимости от их области действия: входящие и исходящие.

public Object onCall(MuleEventContext eventContext) throws Exception {
    MuleMessage message = eventContext.getMessage();
    message.setPayload("Message payload is changed here.");
    return message;
}

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

Исходящие свойства могут быть установлены Mule автоматически, или пользователь может установить их через конфигурацию потока. Эти свойства изменчивы. Они становятся входящими свойствами, когда сообщение входит в другой поток после пересечения транспортных барьеров.

Мы можем устанавливать и получать исходящие и входящие свойства соответственно, вызывая соответствующие методы установки и получения в соответствующих областях:

В приложениях можно объявить два типа переменных.

Одной из них является переменная потока, которая является локальной для потока Mule и доступна в потоке, подпотоках и частных потоках.

message.setProperty(
  "outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
String inboundProp = (String) message.getInboundProperty("outboundKey");

Переменные сеанса после объявления становятся доступными во всем приложении.

4. Транспортные барьеры и ссылка на поток

Транспортные барьеры — это HTTP-коннекторы, виртуальные машины, JMS или аналогичные коннекторы, которым требуются пути или конечные точки для маршрутизации сообщений. Переменные потока недоступны через транспортные барьеры, но переменные сеанса доступны в рамках проекта во всех потоках.

Когда нам нужно создать подпоток или частный поток, мы можем обратиться к потоку из родительского или другого потока, используя компонент потока-ref. И переменные потока, и переменные сеанса доступны в подпотоках и частных потоках, на которые ссылается ссылка на поток.

5. Пример проекта

Давайте создадим приложение в Anypoint Studio, содержащее несколько потоков, которые взаимодействуют между собой через входящие и исходящие соединители.

Давайте посмотрим на первый поток:

Мы можем настроить прослушиватель HTTP следующим образом:

Компоненты потока должны находиться внутри тега \u003cflow\u003e. Итак, пример потока с несколькими компонентами:

Внутри потока мы предоставляем ссылку на настроенный прослушиватель HTTP. Затем мы сохраняем регистратор для регистрации полезной нагрузки, которую прослушиватель HTTP получает с помощью метода POST.

После этого размещается пользовательский класс преобразования Java, который преобразует полезную нагрузку после получения сообщения:

<http:listener-config name="HTTP_Listener_Configuration"
  host="localhost" port="8081" doc:name="HTTP Listener Configuration"/>

Класс преобразования должен расширять AbstractMessageTransformer. Мы также устанавливаем исходящее свойство внутри класса.

<flow name="Flow">
    <http:listener 
      config-ref="HTTP_Listener_Configuration" 
      path="/" doc:name="HTTP" 
      allowedMethods="POST"/>
    <logger message="Original 
      paylaod: #[payload]" 
      level="INFO" doc:name="Logger"/>
    <custom-transformer 
      class="com.baeldung.transformer.InitializationTransformer" 
      doc:name="Java"/>
    <logger message="Payload After Initialization: #[payload]" 
      level="INFO" doc:name="Logger"/>
    <set-variable variableName="f1" 
      value="#['Flow Variable 1']" doc:name="F1"/>
    <set-session-variable variableName="s1" 
      value="#['Session variable 1']" doc:name="S1"/>
    <vm:outbound-endpoint exchange-pattern="request-response" 
      path="test" doc:name="VM"/>
</flow>

Теперь мы уже преобразовали полезную нагрузку в объект сообщения и зарегистрировали это в консоли с помощью регистратора. Мы устанавливаем переменную потока и переменную сеанса.

Наконец, мы отправляем нашу полезную нагрузку через исходящий коннектор виртуальной машины. Путь в соединителе виртуальной машины определяет принимающую конечную точку:

public Object transformMessage(
  MuleMessage message, 
  String outputEncoding) throws TransformerException {
 
    message.setPayload("Payload is transferred here.");
    message.setProperty(
      "outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND);
    return message;
}

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

Компонент Java извлекает исходящие свойства, установленные первым потоком, и возвращает объект, который становится полезной нагрузкой сообщения.

Метод transformMessage() для этой задачи:

«

«Затем переменные потока и сеанса устанавливаются для второго потока. После этого у нас есть ссылка на Flow2 с помощью компонента flow-ref.

В Flow2 мы преобразовали сообщение с помощью класса компонента Java и зарегистрировали его в консоли. Мы также установили переменную потока F3.

public Object transformMessage(
  MuleMessage message, 
  String outputEncoding) throws TransformerException {

    return (String) message.getInboundProperty("outboundKey");
}

После вызова Flow2 с помощью flow-ref, Flow1 будет ждать, пока сообщение будет обработано в Flow2.

Любая переменная потока, установленная в Flow1 и Flow2, будет доступна в обоих потоках, поскольку эти потоки не разделены никакими транспортными барьерами.

Наконец, сообщение отправляется обратно запрашивающей стороне HTTP через виртуальные машины. Мы настроили все виртуальные машины как запрос-ответ.

Мы можем вызвать это приложение из любого клиента REST, разместив в теле любые данные JSON. URL-адрес будет localhost:8081, как настроено в прослушивателе HTTP.

6. Архетип Maven

Мы можем построить проект Mule ESB, используя архетип Mulesoft Maven.

В файл Maven settings.xml нам сначала нужно добавить группу плагинов org.mule.tools:

Затем нам нужно добавить тег профиля, который указывает, где Maven должен искать артефакты Mulesoft: ~ ~~

Наконец, мы можем создать проект, используя mule-project-archetype:create:

<pluginGroups>
    <pluginGroup>org.mule.tools</pluginGroup>
</pluginGroups>

После настройки нашего проекта мы можем создать развертываемый архив, используя пакет mvn.

<profile>
    <id>Mule Org</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <id>mulesoft-releases</id>
            <name>MuleSoft Repository</name>
            <url>https://repository-master.mulesoft.org/releases/</url>
            <layout>default</layout>
        </repository>
    </repositories>
</profile>

После этого мы развернули архив в папку приложений любого автономного сервера Mule.

mvn mule-project-archetype:create -DartifactId=muleesb -DmuleVersion=3.9.0

7. Автономный сервер Mule через репозиторий MuleSoft Maven

Как только что было сказано, для только что созданного проекта требуется автономный сервер Mule.

Если у нас его еще нет, мы можем отредактировать наш pom.xml, чтобы получить его из репозитория MuleSoft Maven:

8. Заключение

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

<plugin>
    <groupId>org.mule.tools.maven</groupId>
    <artifactId>mule-maven-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
        <deploymentType>standalone</deploymentType>
        <muleVersion>3.9.0</muleVersion>
    </configuration>
    <executions>
        <execution>
            <id>deploy</id>
            <phase>deploy</phase>
            <goals>
                <goal>deploy</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Теперь мы можем приступить к созданию приложения ESB с помощью Anypoint Studio для удовлетворения наших различных потребностей.

Как обычно, полный проект можно найти на GitHub.

«

As usual, the complete project can be found over on GitHub.