将netty4 TCP端点限制为单个实例

时间:2018-12-11 14:11:42

标签: apache-camel

我在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&amp;textline=true&amp;keepAlive=true&amp;disconnect=false&amp;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&amp;sync=true&amp;textline=true&amp;keepAlive=true&amp;disconnect=false&amp;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>  

1 个答案:

答案 0 :(得分:1)

通过TRACE级别的日志查看日志,我看到NettyProducer的池确实设置为使用1个最大活动连接,但是NettyProducer却被允许100个空闲连接。我更改了以下行,现在它的行为符合预期:

   <to                                                                 
        uri="netty4:tcp://localhost:8001?workerGroup=#sharedPool&amp;sync=true&amp;textline=true&amp;keepAlive=true&amp;disconnect=false&amp;reuseChannel=true&amp;producerPoolMaxActive=1&amp;producerPoolMaxIdle=1" />

我认为“生产者”设置仅对连接的生产者端(模拟主机路由中的netty)有用,但是看起来它们也可以由消费者端(http路由中的netty)使用。 / p>

edit:我混淆了术语生产者和消费者,并将其反过来了。看到“ to”元素正在产生要消耗的东西的请求,producer *参数是有意义的(http路由中的netty)。 (模拟主机路由中的netty)是请求的使用者。