当前位置: 首页 > 知识库问答 >
问题:

apachecamel节流阀不能按预期工作

尉迟子民
2023-03-14

Apache Camel:2.12.2,activemq:5.7

我们注意到,在下面的路由中,对于前100次交换,节流工作正常。此后,它不是每秒发送100次交换,而是每秒仅发送1次交换。现在,如果我们将timePeriodMillis设置为100,它似乎可以正常工作。注意,我们同时发送500个交换。

<bean id="myProject" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="connectionFactory" ref="myProjectPooledConnectionFactory" />
    <property name="preserveMessageQos" value="true" />
    <property name="transacted" value="false" />
    <property name="maxConcurrentConsumers" value="10" />
</bean>

<bean id="myProjectPooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop" init-method="start">
    <property name="connectionFactory" ref="myProjectAmqConnectionFactory" />
    <property name="maxConnections" value="20" />
    <property name="idleTimeout" value="0" />
</bean>

<bean id="myProjectAmqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" >
    <property name="brokerURL" value="${myProject.broker.url}" />
    <property name="copyMessageOnSend" value="false" />
    <property name="useAsyncSend" value="true" />
</bean>


<!-- Local ActiveMQ Configuration -->
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="connectionFactory" ref="pooledConnectionFactory"/>
    <property name="transacted" value="false"/>
    <property name="maxConcurrentConsumers" value="500"/>
</bean>

<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop" init-method="start">
    <property name="connectionFactory" ref="amqConnectionFactory" />
    <property name="maxConnections" value="1" />
    <property name="idleTimeout" value="0" />
</bean>

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" >
    <property name="brokerURL" value="${broker.url}" />
    <property name="copyMessageOnSend" value="false" />
    <property name="useAsyncSend" value="true" />
</bean>

<route id="myProject.outbound.traffic" errorHandlerRef="error.handler.myProject">
    <from uri="{{queue.myProject.mint.in}}{{queue.myProject.mint.in.args}}"/>
    <throttle timePeriodMillis="1000" >
            <constant>100</constant>
            <process ref="myProjectProcessor" />
            <inOnly uri="myProject:{{queue.myProject}}">
        <log logName="myProject.myProjectProcessor" loggingLevel="INFO" message="this is a test message" />
    </throttle>
</route>

共有1个答案

漆雕博
2023-03-14

我的一位同事找到了答案。这是camel 2.12.2中的一个错误,在2.12.3中似乎已经解决了。这与交换机分配给插槽的方式有关。与其检查插槽是否处于活动状态,不如先检查插槽是否已过。

protected synchronized TimeSlot nextSlot() {
    if (slot == null) {
        slot = new TimeSlot();
    }
    if (slot.isFull() || !slot.isActive()) {
        slot = slot.next();
    }
    slot.assign();
    return slot;
}

看这里

 类似资料:
  • 问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir

  • 问题内容: 根据JavaDoc for ,该函数在比较期间不考虑比例。 现在,我有一个测试用例,看起来像这样: 我希望函数返回的值是10,小数位数为10。打印该值可显示预期的结果。但是该功能似乎并未按照我认为的方式工作。 这里发生了什么? 问题答案: 并 没有 代表0.7。 它代表0.69999999999999999999555910790149937383830547332763671875(

  • 问题内容: 我是否错过了明显痛苦的事情?还是世界上没有人真正使用java.util.BitSet? 以下测试失败: 我真的不清楚,为什么我没有得到长度为2的BitSet和值为10的结果。我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法对两者进行足够的区分。设置为false且从未设置为任何值… (请注意,在构造函数中显式设置BitSet的大小无效,例如: 问题答案: 人们确

  • 问题内容: 以下Dockerfile: 具有输出: 构建时(docker build命令) 看来RUN cd tmp123没有任何作用 为什么呢? 问题答案: 实际上是预期的。 泊坞窗文件不过是docker run + docker commit的包装器。 与做相同的事情: 每次运行时,都会生成一个新容器,因此pwd为’/’。 如果您愿意,可以在github上打开一个问题,以便向Dockerfil

  • 我试着将一个双精度值四舍五入到小数点后两位: var x=0.68999995 var roundX=round(x*100.0)/100.0 println(roundX)//打印0.69 如果打印值是正确的...但var值不是我期望的,继续0.68999999999999995 我需要双值...不像其他StackOverflow答案那样字符串:(

  • 问题内容: 当使用带点名的名称时,例如:,返回的模块不是,返回的内容几乎都是空的!这里发生了什么? 问题答案: 从python文档上: … 当name变量的形式为package.module时,通常返回顶级包(名称直到第一个点),而不是按名称命名的模块。但是,当给出非空的fromlist参数时,将返回按名称命名的模块。这样做是为了与为不同种类的import语句生成的字节码兼容。使用“ import