Статьи

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

Вступление

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

обзор

Этот сценарий, созданный в результате проверки концепции крупной телекоммуникационной компании, теперь распространяется как образец № 502 с UltraESB 1.2.0 или более поздней версии. Клиент веб-службы делает запрос на прокси-службу, размещенную на ESB, которая передает сообщение фактической реализации службы SOAP. Полученный ответ немедленно возвращается клиенту. Копия ответа также помещается в очередь JMS. Вторая прокси-служба опрашивает очередь JMS и отправляет сообщения асинхронно по электронной почте.

В этом примере в качестве поставщика JMS используется Apache ActiveMQ и запускается встроенный экземпляр Apache ActiveMQ в UltraESB с использованием механизма конфигурации ActiveMQ Spring.

SOAP Proxy Service

Прокси-сервис, предоставляемый клиенту, предоставляется через транспорт HTTP, через порт 8280 [см. 1]. Этот прокси-сервис использует WSDL и URL-адрес конечной точки SimpleStockQuoteService, распространяемого вместе с UltraESB для тестирования. Чтобы запустить этот пример службы, используйте графическую утилиту SOA ToolBox [2] и запустите ее пример сервера Jetty. Определение прокси-сервиса простое и понятное, как показано ниже.

    <u:proxy id="soap-proxy">
<u:transport id="http-8280">
<u:property name="wsdlURL" value="http://localhost:9000/service/SimpleStockQuoteService?wsdl"/>
</u:transport>
<u:target>
<u:inDestination>
<u:address>http://localhost:9000/service/SimpleStockQuoteService</u:address>
</u:inDestination>
<u:outSequence>
<u:java><![CDATA[
mediation.sendToEndpoint(msg, "response");
mediation.sendToEndpoint(msg, "jmsQueue");
]]></u:java>
</u:outSequence>
</u:target>
</u:proxy>

<u:endpoint id="response">
<u:address type="response"/>
</u:endpoint>

<u:endpoint id="jmsQueue">
<u:address>jms:/Q.jmsPending</u:address>
</u:endpoint>

 

Сообщение, полученное «мыльным прокси-сервером», предназначено для inDestination, которое перенаправит его на адрес

http://localhost:9000/service/SimpleStockQuoteService

Хотя это и не показано в этом примере, необязательный inSequence может выполнять любую функцию в отношении принятого сообщения (например, преобразование, маршрут, журнал, сохранение в базе данных и т. Д. Или что-либо еще), если это необходимо. Ответ, полученный от удаленной службы SOAP, теперь обрабатывается outSequence. Это указывает две строки кода Java, указанные как часть конфигурации — для отправки этого ответного сообщения обратно исходному клиенту, а также конечную точку ‘jmsQueue’ — которая является местом назначения JMS для очереди с именем JNDI ‘Q.jmsPending’ ,

UltraESB позволяет задавать логику посредничества в Java, Javascript, Ruby, Groovy или любом другом языке сценариев JSR 223, поддерживаемом JDK 6, и прозрачно компилирует его в собственный байт-код Java для оптимального выполнения. Это позволяет разработчику использовать его наиболее предпочтительный и мощный язык программирования в качестве языка посредничества, не изучая какой-либо новый язык конфигурации XML для конкретного поставщика / продукта. Побочным эффектом этого является возможность использования блоков try-catch-finally, объектно-ориентированного посреднического кодирования с наследованием и т. Д. Или предпочтительной Java IDE для отладки и JUnit для модульного тестирования, которые должны быть бесшовно интегрированы. Публичный API, представленный UltraESB, задокументирован на http://api.adroitlogic.org/

Запуск встроенного ActiveMQ JMS-провайдера

Поскольку конфигурация UltraESB является файлом конфигурации Spring, мы можем легко запустить встроенный экземпляр JMS-провайдера ActiveMQ, включив следующий фрагмент конфигурации.

    <amq:broker useJmx="false" persistent="false">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:0"/>
</amq:transportConnectors>
</amq:broker>

Слушатель JMS и отправитель SMTP

 Теперь мы определим второй прокси-сервис, который будет опрашивать очередь назначения JMS и отправлять эти сообщения через SMTP с помощью Gmail.

    <u:proxy id="jmsToEmail">
<u:transport id="jms-lsnr">
<u:property name="destinationName" value="Q.jmsPending"/>
</u:transport>
<u:target>
<u:inSequence>
<u:java><![CDATA[
logger.info("Processing queued message from JMS and sending email..");
msg.addMessageProperty("subject", "Custom Subject for Response");
msg.setDestinationURL("mailto:mail.maildemo.demo@gmail.com"); // <-- REPLACE THIS
mediation.sendToEndpoint(msg, "smtp-gmail");
]]></u:java>
</u:inSequence>
</u:target>
</u:proxy>

<!--Sends email using the SMTP configuration defined as 'smtp-email', to the 'default' destination of the message-->
<u:endpoint id="smtp-gmail">
<u:address type="default"/>
</u:endpoint>

 

Опять же, конфигурация краткая и простая для понимания. Прокси-сервис jmsToEmail опрашивает JMS-адресат Q.jmsPending, и полученные сообщения обрабатываются с помощью фрагмента кода Java, указанного в inSequence. В этом примере демонстрируется, как настраивается «Тема» для электронной почты, но в этом примере используется адрес с жестко заданным адресом, хотя его можно легко найти другими способами в реальном сценарии. В сообщении в качестве адреса назначения указывается адрес mailto: UltraESB отправляет это сообщение с использованием настроенной конфигурации отправителя транспорта SMTP [см. 1].

 

Пробовать образец

1. Настройте учетные данные SMTP в соответствии с необходимостью в файле samples / conf / ultra-sample-502.xml. Пример конфигурации был написан для использования SMTP-сервера Gmail. Проверьте строки с комментариями «ЗАМЕНИТЕ ЭТО»

2. Запустите образец UltraESB # 502 следующим образом: ultraesb-1.2.0 / bin $ ./ultraesb.sh — образец 502

3. Запустите SOA ToolBox как: ultraesb-1.2.0 / bin $ ./toolbox.sh и запустите образец Jetty Server.

 Пример сервера на пристани в ToolBox

4. Запустите клиент HTTP / S из панели инструментов. Выберите сообщение из предустановки «1», установите URL-адрес «http: // localhost: 8280 / service / soap-proxy» и отправьте запрос. Вы сразу увидите ответ из панели инструментов.

5. Вы должны увидеть строку «Последовательность INFO Обработка сообщения из JMS, находящегося в очереди и отправка электронной почты …», поскольку адресат JMS опрашивается и электронная почта отправляется, и ответ будет получен через указанную учетную запись электронной почты, как показано ниже.

Нагрузочное тестирование сценария

ToolBox включает в себя клиент нагрузочного тестирования HTTP / S, который можно использовать для симуляции тысяч одновременно работающих пользователей, выполняющих тысячи запросов в итерации. Используя модуль нагрузочного тестирования «JavaBench» UltraESB, вы можете протестировать этот сценарий с желаемыми уровнями нагрузки — при условии, что ваш JMS-провайдер и сервер электронной почты переносят это.

Проверьте http://esbperformance.org для получения информации о нагрузочном тестировании сценариев использования ESB

 

Ссылки

[1] Образец UltraESB № 502

[2] AdroitLogic ToolBox