当配置多个全局HTTP连接器时,为什么REST组件不会在应用程序内部接收调用?

时间:2013-04-08 21:28:19

标签: mule mule-studio cloudhub

我很难配置并部署到具有多个全局HTTP连接器和REST组件的应用程序CloudHub。

我的应用程序有两个流程:一个轮询新闻的RSS源,并将该源的json表示发布到同一个应用程序中的http入站端点(端点驻留在第二个流上)。第二个流程接收该帖子,做了一些魔术,包括将项目保存到存储,然后通过http出站端点通知外部node.js Web应用程序将项目通过Web套接字推送到活动客户端。

我尝试了几十种不同的配置,包括各种HTTP全局连接器和http输入和输出端点,但我无法让一切工作。我目前有:

  1. 轮询HTTP连接器
    • 引用以上轮询http连接器以获取RSS源
    • 的HTTP端点
  2. 一个全局连接器(我们将调用HTTP_ONE)以localhost:${http.port}接收邮件
    • 配置为引用HTTP_ONE并配置为将活动发布到/ api / v1 / activity的http oubound端点
    • 配置为接收/api/v1消息的http入站端点和位于此端点后面的Jersey控制器,该控制器占用/activity
  3. 另一个全局连接器(HTTP_TWO),其中外部主机设置为代理主机名(例如somehost.somewhere.com)。
    • 配置为向somehost.somewhere.com发送消息的http出站端点
  4. 在我的本地主机上,我必须使用各种属性来允许笔记本电脑上多个端口上的所有这些活动。

    在CloudHub上,除了在调用外部Web服务的oubound端点之外,我在任何地方都使用localhost和$ {http.port}。

    我可以获得一个流程或另一个流程但不是两个....我的问题似乎是将RSS源中的给定新闻项目发布到入站HTTP端点。它正在将帖子发送到http://localhost:80/api/v1/activity,但是连接器说没有这样的路径(它只列出/ api / v1作为选项),这让我觉得这个呼叫没有达到Jersey控制器的程度位于Global Connector和/api/v1/activity的http入站端点后面。这种行为是使用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 Feed

    <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>
    

1 个答案:

答案 0 :(得分:1)

我不明白为什么在proxyHostnameproxyPort连接器上配置了EduStream_HTTPEduStreamESB_HTTP,而来自这些连接器的HTTP端点的目标是与它们相同的主机/端口目的地址。这对我没有任何意义。

确定是否需要使用代理?

对于EduStreamESB_HTTP,答案显然是否定的:您正在从CloudHub调用CloudHub,因此无需代理。

对于EduStreamESB_HTTP,也许......但这看起来仍然很奇怪。