Я изо всех сил пытаюсь настроить и развернуть в CloudHub приложение с несколькими глобальными соединителями HTTP и компонентом REST.
В моем приложении есть два потока: один опрашивает RSS-канал на наличие новостей и отправляет json-представление этого канала во входящую конечную точку http в том же приложении (конечная точка находится во втором потоке). Второй поток получает это сообщение, делает некоторые волшебные действия, в том числе сохраняет элемент в хранилище, а затем уведомляет через исходящую конечную точку http внешнее веб-приложение node.js, чтобы передать элемент через веб-сокеты активным клиентам.
Я перепробовал десятки различных конфигураций, включающих различные глобальные коннекторы HTTP и входящие и исходящие конечные точки http, но не могу заставить все работать. В настоящее время у меня есть:
- A Polling HTTP Connector
- An HTTP endpoint referencing above polling http connector to get RSS Feed
- One Global Connector (we'll call HTTP_ONE) to receive messages at
localhost:${http.port}
- An http oubound endpoint configured referencing HTTP_ONE and configured to post an activity to /api/v1/activity
- Входящая конечная точка HTTP, настроенная на получение сообщений для
/api/v1
, и контроллер Джерси, расположенный сразу за этой конечной точкой, которая принимает/activity
.
- Another Global Connector (HTTP_TWO) with an external host set as the proxy host name (e.g. somehost.somewhere.com).
- An http outbound endpoint configured to post messages to somehost.somewhere.com
На моем локальном хосте мне пришлось использовать различные свойства, чтобы разрешить все эти действия на нескольких портах моего ноутбука.
В CloudHub я использую localhost и ${http.port} везде, кроме исходящей конечной точки, которая вызывает внешнюю веб-службу.
Я могу заставить работать один или другой поток, но не оба... Моя проблема, похоже, связана с публикацией данного элемента новостей из RSS-канала в конечную точку входящего HTTP. Он отправляет сообщение на http://localhost:80/api/v1/activity
, но коннектор говорит, что такого пути не существует (в нем только указан /api/v1 в качестве опции), что наводит меня на мысль, что вызов не доходит до контроллера Джерси, который находится за Global Connector и входящая конечная точка http для /api/v1/activity
. Является ли такое поведение врожденным недостатком при использовании компонента REST и нескольких глобальных HTTP-коннекторов? Кроме того, почему мы должны ссылаться на глобальный HTTP-коннектор при совершении исходящего вызова? Почему мы не можем использовать HTTP-коннектор по умолчанию? (Возможно, последние два вопроса должны быть в следующем посте...)
Вот большая часть релевантной конфигурации для двух потоков:
Глобальные соединители
<http:polling-connector name="PollingHttpConnector" pollingFrequency="60000" doc:name="HTTP Polling" clientSoTimeout="10000" cookieSpec="netscape" receiveBacklog="0" receiveBufferSize="0" sendBufferSize="0" serverSoTimeout="10000" socketSoLinger="0" validateConnections="true"/>
<http:connector name="EduStream_HTTP" cookieSpec="netscape" validateConnections="true" sendBufferSize="0" receiveBufferSize="0" receiveBacklog="0" clientSoTimeout="10000" serverSoTimeout="10000" socketSoLinger="0" proxyHostname="${edustream.host}" doc:name="HTTP\HTTPS" proxyPort="80"/>
<http:connector name="EduStreamESB_HTTP" cookieSpec="netscape" validateConnections="true" sendBufferSize="0" receiveBufferSize="0" receiveBacklog="0" clientSoTimeout="10000" serverSoTimeout="10000" socketSoLinger="0" proxyHostname="localhost" proxyPort="${http.port}" doc:name="HTTP\HTTPS"/>
Поток RSS-канала новостей
<flow name="ucdNewsConsumer" doc:name="ucdNewsConsumer">
<http:inbound-endpoint address="http://news.ucdavis.edu/xml/getnews.php/rss/category/General%20Interest"
connector-ref="PollingHttpConnector" doc:name="HTTP" exchange-pattern="one-way"/>
<rss:feed-splitter/>
<rss:entry-last-updated-filter/>
<component class="edu.ucdavis.edustream.esb.news.rss.EntryReceiver" doc:name="Java"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="${http.port}" path="api/v1/activity" doc:name="HTTP" mimeType="application/json" connector-ref="EduStreamESB_HTTP" />
<logger message="Payload is: #[payload] Inbound Headers: #[headers:INBOUND:*] Outbound Headers: #[headers:OUTBOUND:*] Exception is: #[exception]" level="INFO" doc:name="Logger"/>
</flow>
Служба публикации активности – основной поток
<flow name="edustreamesbFlow1" doc:name="edustreamesbFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="${http.port}" doc:name="HTTP" contentType="application/json" mimeType="application/json" path="api/v1" connector-ref="EduStreamESB_HTTP"/>
<jersey:resources doc:name="REST">
<component class="edu.ucdavis.edustream.esb.activity.restapi.ActivityController"/>
</jersey:resources>
<component class="edu.ucdavis.edustream.esb.activity.restapi.JerseyResponseTransformer" doc:name="JerseyRespTrans"/>
<flow-ref name="PublishActivity" doc:name="Publish Activity"/>
</flow>
<sub-flow name="PublishActivity" doc:name="PublishActivity">
<component doc:name="ActivityService">
<spring-object bean="activityService"/>
</component>
<logger message="#[payload] #[message]" level="INFO" doc:name="Logger"/>
<http:outbound-endpoint exchange-pattern="request-response" host="${edustream.host}" port="80" path="api/v1/activity" mimeType="application/json" contentType="application/json" doc:name="HTTP" connector-ref="EduStream_HTTP"/>
</sub-flow>