Apache-Camel не работает, как ожидалось

1

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>
Теги:
spring
activemq
apache-camel
throttle

1 ответ

0
Лучший ответ

Мой коллега нашел ответ. Это ошибка на верблюде 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;
}

См. Здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню