我在单个项目中遇到多个HTTP连接器的问题。我想要做的可能是不可能的,但我想知道是否有一些技巧可以让我完成它。
作为起点,我有一个带有三个流的连接器:一个处理根URL,另外两个处理相对URL。这是因为每个地址都返回我期望的有效负载......例如,访问/ flow3相对路径返回“Flow3”。
<http:connector name="Connector1">
</http:connector>
<flow name="Flow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" connector-ref="Connector1"/>
<set-payload value="Flow1"/>
</flow>
<flow name="Flow2">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" connector-ref="Connector1" path="flow2"/>
<set-payload value="Flow2"/>
</flow>
<flow name="Flow3">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" connector-ref="Connector1" path="flow3"/>
<set-payload value="Flow3"/>
</flow>
但是,我想说我想用一种方式配置一些端点,用另一种方式配置一些端点......也许是一个不同的线程模型......使用连接器。我尝试做类似下面的添加另一个连接器并让第三个流引用它:
<http:connector name="Connector1">
</http:connector>
<http:connector name="Connector2">
<!-- Eventually some different configuration here -->
</http:connector>
<flow name="Flow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" connector-ref="Connector1"/>
<set-payload value="Flow1"/>
</flow>
<flow name="Flow2">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" connector-ref="Connector1" path="flow2"/>
<set-payload value="Flow2"/>
</flow>
<flow name="Flow3">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost"
port="8081" connector-ref="Connector2" path="flow3"/>
<set-payload value="Flow3"/>
</flow>
当我这样做时,Flow1和Flow2继续工作,但访问/ flow3进入Flow1返回“Flow1”。我假设这是因为处理Connector1上的根级别URL的流程表明它可以处理此地址。
我尝试删除Flow1以查看会发生什么。 Flow2继续工作,但Flow3现在报告:
No receiver found with secondary lookup on connector: Connector1 with URI key: http://localhost:8081/flow3
(我想知道这是否是导致问题的favicon请求,但我不确定。)
正在做这样的事情......也就是说,在同一个项目中有两个连接器,但是明确地使用其中一个连接器作为相对URL ......可能吗?
答案 0 :(得分:3)
问题是每个端点都创建了自己的消息接收器。通常这不是问题,但是当涉及基于TCP的传输时,它们将竞争端口。
如果查看日志,在启动splash scree之前,您将看到以下错误:
Root Exception stack trace:
java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
at java.net.ServerSocket.bind(ServerSocket.java:376)
+ 3 more (set debug level logging or '-Dmule.verbose.exception
这意味着Flow3的入站端点无法绑定端口8081,因为已经拥有该端口的套接字和该套接字属于Connector1
答案 1 :(得分:1)
在我看来,你有两种方法:
Mule域项目以共享资源(http-connector):http://www.mulesoft.org/documentation/display/current/Shared+Resources
Mule模式:http-proxy暴露公共端口(8081)并在内部调用使用其他端口的应用程序,绑定主机用于localhost以防止外部访问: http://www.mulesoft.org/documentation/display/current/HTTP+Proxy+Pattern