2

我有以下路线:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <threadPoolProfile id="defaultProfile"
        defaultProfile="true" poolSize="100" maxPoolSize="200" />

    <route>
        <from uri="amq:example.MyQueue" />
        <setHeader headerName="myRoutingSlipHeader">
            <constant>amq:one#amq:two#amq:three#amq:four</constant>
        </setHeader>
        <log message="Makan" />
        <setExchangePattern pattern="InOut" />
        <routingSlip uriDelimiter="#">
            <header>myRoutingSlipHeader</header>
        </routingSlip>
        <setExchangePattern pattern="InOnly" />
        <log message="End: ${body}" />
    </route>

    <route>
        <from uri="amq:one" />
        <to uri="bean:helloBean?method=stepOne" />
    </route>

    <route>
        <from uri="amq:two" />
        <to uri="bean:helloBean?method=stepTwo" />
    </route>

    <route>
        <from uri="amq:three" />
        <to uri="bean:helloBean?method=stepThree" />
    </route>

    <route>
        <from uri="amq:four" />
        <to uri="bean:helloBean?method=stepFour" />
    </route>

    </camelContext>

<bean id="amq" class="org.apache.activemq.camel.component.ActiveMQComponent"
    p:brokerURL="tcp://localhost:61616" p:transacted="true"
    p:cacheLevelName="CACHE_CONSUMER" p:concurrentConsumers="20"
    p:maxConcurrentConsumers="500" p:idleConsumerLimit="10"
     />

鉴于 example.MyQueue 预加载了 1000 条消息,每个 hello bean 的 step* 方法需要 250ms,当我执行 camel:run 时,性能仍然很差。它每 1 秒按顺序打印“结束:...”,而不是并行。这里会有什么问题?

在以下非常简单的情况下,我看到了一个奇怪的行为。当没有 JMS 生产者将消息放入队列时,打印按顺序进行。但如果有,打印是并行发生的。有什么解释?

<threadPoolProfile id="defaultProfile"
        defaultProfile="true" poolSize="100" maxPoolSize="200" />

<route>
  <from uri="amq:example.MyQueue" />
  <delay>
    <constant>1000</constant>
  </delay>
  <log message="End: ${body}" />
</route>

<bean id="amq" class="org.apache.activemq.camel.component.ActiveMQComponent"
    p:brokerURL="tcp://localhost:61616" p:transacted="true"
    p:cacheLevelName="CACHE_CONSUMER" p:concurrentConsumers="20"
    p:maxConcurrentConsumers="500" p:idleConsumerLimit="10"
     />
4

3 回答 3

1

尝试更换

   <from uri="amq:example.MyQueue" />

   <from uri="amq:example.MyQueue?concurrentConsumers=200&amp;maxConcurrentConsumers=500" />
于 2015-05-13T13:03:09.577 回答
0

路由单按顺序运行,并且您通过 JMS 请求/回复(例如 MEP 是 InOut),因此处理一条消息需要

  • 调用 amq:one = 250 毫秒(请求/回复)
  • 调用 amq:two = 250 毫秒(请求/回复)
  • 调用 amq:three = 250 毫秒(请求/回复)
  • 调用 amq:four = 250 毫秒(请求/回复)

每条消息总共 1 秒。

< from > 中的 AMQ 路由可以并行处理消息。但是每条消息仍然需要 1 秒的时间来处理。

于 2013-10-04T07:08:41.257 回答
0

我猜 routingSlip 模式是同步的。你需要一些异步组件来处理这个。请检查:http ://camel.apache.org/async.html

只有一个问题,为什么需要设置 ExchangePattern?

于 2013-10-06T02:31:02.987 回答