2013-04-08 8 views
0

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

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

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

  1. социологического HTTP Connector
    • HTTP-конечная точка ссылки выше соединителя HTTP опроса, чтобы получить RSS Feed
  2. One Global Connector (мы будем называть HTTP_ONE), чтобы получать сообщения на localhost:${http.port}
    • НТТР oubound конечная точка сконфигурированы ссылки HTTP_ONE и выполненный с возможностью отправлять активностью/API/v1/Activity
    • Входящая конечная точка http настроена для приема сообщений для /api/v1 и контроллера Джерси, сидящего за этой конечной точкой, которая принимает /activity.
  3. Другой глобальный соединитель (HTTP_TWO) с внешним хостом, установленным как имя хоста прокси (например, somehost.somewhere.com).
    • НТТР исходящая конечная точка настроена для отправки сообщений в somehost.somewhere.com

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

В CloudHub я использую localhost и $ {http.port} везде, кроме оконечной точки Oubound, которая вызывает внешнюю веб-службу.

Я могу получить один поток или другой рабочий, но не оба .... Моя проблема связана с отправкой данного новостного материала из RSS-канала на входящую HTTP-конечную точку. Он отправляет сообщение в http://localhost:80/api/v1/activity, но соединитель говорит, что такого пути нет (он только перечисляет/api/v1 в качестве опции), что заставляет меня думать, что вызов не доходит до контроллера Jersey, который сидит за Глобальный соединитель и конечная точка 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> 

активность публик п Service - Core 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> 
+1

Зачем использовать HTTP для связи в одном приложении? –

+0

Для основного потока требуется API REST для внешних клиентов. Я просто повторно использую эту конечную точку для других потоков, которые подают один и тот же тип сообщений в приложении к потоку ядра. Я рассмотрел использование транспорта виртуальной машины для всех сообщений для основного потока, которые генерируются из одного и того же приложения Mule, но я думаю, что я все еще пытаюсь понять, почему это невозможно с помощью HTTP ... – GarySharpe

ответ

1

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

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

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

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

+0

приводит к ошибке ниже. Я установил все в $ {http.port}. Тем не менее, конечная точка http для коннектора опроса продолжает восстанавливаться до 8081 для порта после того, как я развернусь в CloudHub. Я почти не думаю, что это имело бы значение, за исключением того, что 8081 продолжает появляться в исключении: – GarySharpe

+0

'Исключение: \t org.mule.api.transport.DispatchException: Не удалось перенаправить событие через конечную точку: \t DefaultOutboundEndpoint {endpointUri = http:// локальный: 8081/API/v1/активность, \t разъем = HttpConnector \t { \t имя = HTTP_HTTPS_GENERIC \t supportedProtocols = [HTTP] \t serviceOverrides = \t} \t, имя = 'endpoint.http. localhost.8081.api.v1.activit у», \t MEP = REQUEST_RESPONSE, \t свойства = {Content-Type = применение/JSON}, \t transactionConfig = Транзакция { \t \t завод = нуль, действие = INDIFFERENT, таймаут = 0}, \t \t endpointEncoding = UTF-8, \t \t disableTransportTransformer = false}.Полезная нагрузка сообщение имеет тип: PostMethod' – GarySharpe

+0

Это также появляется в журналах: WARN \t 04-08-13 16:06:09 \t Ресивер не найден со средним поиска на разъеме: EduStreamESB_HTTP с ключом URI: WARN \t 04-08-13 16:06:09 \t Приемники на разъеме являются: { HTTP: // локальный: 8081/API/v1 = HttpMessageReceiver {это = 3c8b22e5, receiverKey = HTTP: // локальный: 8081/api/v1, endpoint = http: // localhost: 8081/api/v1} } – GarySharpe