Mule 为什么赢了';当配置了多个全局HTTP连接器时,REST组件是否未接收应用程序内部发出的调用?
我正在努力配置并部署一个带有多个全局HTTP连接器和REST组件的应用程序到CloudHub 我的应用程序有两个流:一个轮询RSS提要以获取新闻,并将该提要的json表示发布到同一应用程序中的http入站端点(端点位于第二个流上)。第二个流接收该帖子,执行一些神奇的操作,包括将项目持久化到存储,然后通过http出站端点通知外部node.js web应用程序通过web套接字将项目推送到活动客户端 我已经尝试了几十种不同的配置,包括各种HTTP全局连接器和HTTP入站和出站端点,但我无法让一切都正常工作。我目前有:Mule 为什么赢了';当配置了多个全局HTTP连接器时,REST组件是否未接收应用程序内部发出的调用?,mule,mule-studio,cloudhub,Mule,Mule Studio,Cloudhub,我正在努力配置并部署一个带有多个全局HTTP连接器和REST组件的应用程序到CloudHub 我的应用程序有两个流:一个轮询RSS提要以获取新闻,并将该提要的json表示发布到同一应用程序中的http入站端点(端点位于第二个流上)。第二个流接收该帖子,执行一些神奇的操作,包括将项目持久化到存储,然后通过http出站端点通知外部node.js web应用程序通过web套接字将项目推送到活动客户端 我已经尝试了几十种不同的配置,包括各种HTTP全局连接器和HTTP入站和出站端点,但我无法让一切都正常
- HTTP端点引用上面的轮询HTTP连接器以获取RSS提要
localhost:${HTTP.port}
- http oubound端点,配置为引用http_ONE并将活动发布到/api/v1/activity
- 配置为接收
消息的http入站端点和位于该端点后面的Jersey控制器,该端点执行/api/v1
/activity
- 配置为向somehost.somewhere.com发布消息的http出站端点
http://localhost:80/api/v1/activity
,但是连接器说不存在这样的路径(它只将/api/v1列为一个选项),这使我认为调用没有到达位于全局连接器后面的Jersey控制器和/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提要流
<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>
活动发布服务——核心流程
<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>
我不明白为什么
proxyHostname
和proxyPort
都配置在EduStream\u HTTP
和edustreams\u HTTP
连接器上,而这些连接器的HTTP端点将同一主机/端口作为其目标地址。这对我来说毫无意义
你真的确定你需要使用代理吗
对于edutravelsb_HTTP
来说,答案显然是否定的:您正在从CloudHub调用CloudHub,因此不需要代理
对于HTTP教育流,可能。。。但这似乎仍然很奇怪。为什么在同一个应用程序中使用HTTP进行通信?核心流需要一个用于外部客户端的REST API。我只是将该端点用于将应用程序中相同类型的消息提供给核心流的其他流。我已经考虑过使用VM传输从同一个Mule应用程序中生成的所有核心流的消息,但我想我仍然在试图理解为什么不能用HTTP实现这一点……这导致了下面的错误。我已将所有内容设置为${http.port}。但是,在我部署到CloudHub之后,轮询连接器的http端点会一直恢复到端口的8081。我几乎不认为这有什么关系,除了8081一直出现在异常中:
异常是:org.mule.api.transport.DispatchException:无法通过端点路由事件:DefaultOutboundEndpoint{endpointUri=http://localhost:8081/api/v1/activity,connector=HttpConnector{name=HTTP\u HTTPS\u通用支持协议=[HTTP]serviceOverrides=},name='endpoint.http.localhost.8081.api.v1.activity',mep=REQUEST\u-RESPONSE,properties={Content-Type=application/json},transactionConfig=Transaction{factory=null,action=interference,timeout=0},endpointEncoding=UTF-8,disableTransportTransformer=false}。消息有效负载的类型为:PostMethod
这也显示在日志中:WARN 04-08-13 16:06:09在连接器上未找到二次查找的接收器:带URI键的EdutravelSB_HTTP:WARN 04-08-13 16:06:09连接器上的接收器为:{This=3c8b22e5,receiverKey=,endpoint=}这没有意义,因为您的http://localhost:8081/api/v1
所以调用http://localhost:8081/api/v1/activity
应收到。完整配置。发布配置的最佳方式是什么?作为评论(这似乎是限制性的)还是作为对原始帖子的补充?