我很难配置并部署到具有多个全局HTTP连接器和REST组件的应用程序CloudHub。
我的应用程序有两个流程:一个轮询新闻的RSS源,并将该源的json表示发布到同一个应用程序中的http入站端点(端点驻留在第二个流上)。第二个流程接收该帖子,做了一些魔术,包括将项目保存到存储,然后通过http出站端点通知外部node.js Web应用程序将项目通过Web套接字推送到活动客户端。
我尝试了几十种不同的配置,包括各种HTTP全局连接器和http输入和输出端点,但我无法让一切工作。我目前有:
localhost:${http.port}
接收邮件
/api/v1
消息的http入站端点和位于此端点后面的Jersey控制器,该控制器占用/activity
。在我的本地主机上,我必须使用各种属性来允许笔记本电脑上多个端口上的所有这些活动。
在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>
答案 0 :(得分:1)
我不明白为什么在proxyHostname
和proxyPort
连接器上配置了EduStream_HTTP
和EduStreamESB_HTTP
,而来自这些连接器的HTTP端点的目标是与它们相同的主机/端口目的地址。这对我没有任何意义。
您确定是否需要使用代理?
对于EduStreamESB_HTTP
,答案显然是否定的:您正在从CloudHub调用CloudHub,因此无需代理。
对于EduStreamESB_HTTP
,也许......但这看起来仍然很奇怪。