我正在努力配置一个具有多个全局 HTTP 连接器和一个 REST 组件的应用程序并将其部署到 CloudHub。
我的应用程序有两个流:一个轮询新闻的 RSS 提要,并将该提要的 json 表示发布到同一应用程序中的 http 入站端点(端点驻留在第二个流上)。第二个流程接收该帖子,执行一些魔术,包括将项目持久化到存储,然后通过 http 出站端点通知外部 node.js Web 应用程序通过 Web 套接字将项目推送到活动客户端。
我已经尝试了几十种不同的配置,涉及各种 HTTP 全局连接器和 http 入站和出站端点,但我无法让一切正常工作。我目前有:
- 轮询 HTTP 连接器
- 引用上述轮询 http 连接器以获取 RSS 源的 HTTP 端点
- 一个全局连接器(我们将调用 HTTP_ONE)接收消息
localhost:${http.port}
- 配置为引用 HTTP_ONE 并配置为将活动发布到 /api/v1/activity 的 http 出站端点
- 一个配置为接收消息的 http 入站端点
/api/v1
和一个位于该端点后面的 Jersey 控制器,它采用/activity
.
- 另一个全局连接器 (HTTP_TWO) 将外部主机设置为代理主机名(例如 somehost.somewhere.com)。
- 配置为将消息发布到 somehost.somewhere.com 的 http 出站端点
在我的本地主机上,我不得不使用各种属性来允许在我的笔记本电脑的多个端口上进行所有这些活动。
在 CloudHub 上,我在任何地方都使用 localhost 和 ${http.port},但在调用外部 Web 服务的出站端点中除外。
我可以让一个流程或另一个工作,但不能同时工作......我的问题似乎是将给定的新闻项目从 RSS 提要发布到入站 HTTP 端点。它将帖子发送到http://localhost:80/api/v1/activity
,但连接器说不存在这样的路径(它只列出 /api/v1 作为选项),这让我认为呼叫没有到达位于 Global 后面的 Jersey Controller连接器和/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>