我在8001有一个模拟端点,它将回显提供给它的任何内容。 我有一个http端点,它将URL的末尾提交给模拟端点,并提供来自端点响应的响应。 很好。
挑战是,我希望http路由仅使用1条tcp连接到8001端点。
我创建了一个工作组(如其他地方所述),并将工作人员数设置为1。通过查看源代码,我认为这种方法应该可行。
但是,当我执行此bash命令时:
for a in {1..5}; do curl "http://localhost:8080/upstream/REQUESTNUM$a" > $a.txt & done;
我看到到8001的多个连接。我本以为http终结点请求必须共享一个池工作器,但是事实并非如此。
也许我错过了一些东西,或者还有另一种方法可以实现我的目标,即对所有http请求仅使用一个后端tcp连接。
我该怎么做?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext
xmlns="http://camel.apache.org/schema/spring">
<route id="mockUpstream">
<from
uri="netty4:tcp://localhost:8001?sync=true&textline=true&keepAlive=true&disconnect=false&reuseChannel=true" />
<log message="Incoming to upstream: ${body}" />
<transform>
<simple>${body}</simple>
</transform>
</route>
<route id="httpServer">
<from
uri="netty4-http:http://0.0.0.0:8080/upstream?matchOnUriPrefix=true" />
<!-- optional just use CamelHttpQuery from header, for full query -->
<log
message="Incoming http command: ${in.headers[CamelHttpPath]}" />
<transform>
<simple>${in.headers[CamelHttpPath]}</simple>
</transform>
<to
uri="netty4:tcp://localhost:8001?workerGroup=#sharedPool&sync=true&textline=true&keepAlive=true&disconnect=false&reuseChannel=true" />
<transform>
<simple>${body}</simple>
</transform>
</route>
</camelContext>
<bean id="poolBuilder"
class="org.apache.camel.component.netty4.NettyWorkerPoolBuilder">
<property name="workerCount" value="1" />
</bean>
<bean id="sharedPool" class="io.netty.channel.EventLoopGroup"
factory-bean="poolBuilder" factory-method="build"
destroy-method="shutdown">
</bean>
</beans>
答案 0 :(得分:1)
通过TRACE级别的日志查看日志,我看到NettyProducer的池确实设置为使用1个最大活动连接,但是NettyProducer却被允许100个空闲连接。我更改了以下行,现在它的行为符合预期:
<to
uri="netty4:tcp://localhost:8001?workerGroup=#sharedPool&sync=true&textline=true&keepAlive=true&disconnect=false&reuseChannel=true&producerPoolMaxActive=1&producerPoolMaxIdle=1" />
我认为“生产者”设置仅对连接的生产者端(模拟主机路由中的netty)有用,但是看起来它们也可以由消费者端(http路由中的netty)使用。 / p>
edit:我混淆了术语生产者和消费者,并将其反过来了。看到“ to”元素正在产生要消耗的东西的请求,producer *参数是有意义的(http路由中的netty)。 (模拟主机路由中的netty)是请求的使用者。