Почему компонент REST не получает внутренний вызов приложения, если настроено несколько глобальных HTTP-коннекторов?

Я изо всех сил пытаюсь настроить и развернуть в CloudHub приложение с несколькими глобальными соединителями HTTP и компонентом REST.

В моем приложении есть два потока: один опрашивает RSS-канал на наличие новостей и отправляет json-представление этого канала во входящую конечную точку http в том же приложении (конечная точка находится во втором потоке). Второй поток получает это сообщение, делает некоторые волшебные действия, в том числе сохраняет элемент в хранилище, а затем уведомляет через исходящую конечную точку http внешнее веб-приложение node.js, чтобы передать элемент через веб-сокеты активным клиентам.

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

  1. A Polling HTTP Connector
    • An HTTP endpoint referencing above polling http connector to get RSS Feed
  2. 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.
  3. 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>

person GarySharpe    schedule 08.04.2013    source источник
comment
Зачем использовать HTTP для связи в одном и том же приложении?   -  person David Dossot    schedule 09.04.2013
comment
Для основного потока требуется REST API для внешних клиентов. Я просто повторно использую эту конечную точку для других потоков, которые передают сообщения того же типа внутри приложения в основной поток. Я рассматривал возможность использования VM Transport для всех сообщений в основном потоке, которые генерируются из одного и того же приложения Mule, но я думаю, что все еще пытаюсь понять, почему это нельзя сделать с помощью HTTP...   -  person GarySharpe    schedule 09.04.2013


Ответы (1)


Я не понимаю, почему proxyHostname и proxyPort настроены как на соединителях EduStream_HTTP, так и на EduStreamESB_HTTP, в то время как конечные точки HTTP из этих соединителей нацелены на тот же хост/порт, что и их адрес назначения. Это не имеет для меня никакого смысла.

Вы действительно уверены, что вам нужно использовать прокси?

Для EduStreamESB_HTTP однозначно нет: вы звоните в CloudHub из CloudHub, поэтому прокси-сервер не нужен.

Для EduStreamESB_HTTP, может быть... но это все равно кажется очень странным.

person David Dossot    schedule 08.04.2013
comment
Это приводит к ошибке ниже. Я установил все на ${http.port}. Однако конечная точка http для соединителя опроса продолжает возвращаться к 8081 для порта после развертывания в CloudHub. Я почти не думаю, что это имеет значение, за исключением того, что 8081 продолжает появляться в исключении: - person GarySharpe; 09.04.2013
comment
Это также отображается в журналах: WARN 04-08-13 16:06:09 При вторичном поиске на соединителе получатель не найден: EduStreamESB_HTTP с ключом URI: WARN 04-08-13 16:06:09 Получатели на соединителе: { localhost:8081/api/v1=HttpMessageReceiver{this=3c8b22e5, ReceiverKey=localhost:8081/api/v1, endpoint=localhost:8081/api/v1} } - person GarySharpe; 09.04.2013
comment
Это не имеет смысла, потому что у вас есть приемник на http://localhost:8081/api/v1, поэтому вызов на http://localhost:8081/api/v1/activity должен быть получен. Полный конфиг пожалуйста. - person David Dossot; 09.04.2013
comment
Как лучше всего опубликовать этот конфиг? В качестве комментария (который кажется ограничивающим) или в качестве дополнения к исходному сообщению? - person GarySharpe; 09.04.2013
comment
Я добавил то, что я считаю наиболее важными частями двух приведенных выше потоков в исходном посте. Спасибо за ваш вклад, Дэвид! - person GarySharpe; 09.04.2013