Camel sendBody性能问题

时间:2015-06-05 13:38:55

标签: performance apache-camel activemq

我有一个骆驼,activeMQ,基于弹簧的应用程序,并遇到了一个特殊的问题w.r.t性能。

当我调用producerTemplate.sendBody()时,返回的调用需要40ms到900ms之间的任何时间。没有模式 - 它遍布整个地方。消息本身很小 - 少于100个字节。注意;除了这些测试之外,系统中没有其他任何内容 - 没有内存问题,没有cpu问题等。

我尝试了以下步骤: 1)将oracle替换为我的商店并使用了KahaDB - 没有区别 2)在activeMQ配置中,我将useAsyncSend设置为true,alwaysSessionAsync设置为false - 没有区别 3)只是为了好玩我在 - 无差异

中设置persistent = false

直到现在我才怀疑持久性是某种罪魁祸首 - 看起来并非如此

由于上述所有更改仍然存在,我调用了producerTemplate.sendBody()两次 - 这是真正有趣的地方 - 第一次调用需要相同的时间(40到800毫秒) - 第二次调用需要的时间少于1毫秒。现在这就是我所期待的那种表现: - )

我有点迷失 - 我怀疑由于某种原因,对producerTemplate.sendBody()的调用直到消费者线程STARTS才返回,这就是为什么第二次调用sendBody的速度非常快。这几乎没有任何意义,但我已经没有理论了。

任何帮助和指示都会非常有用 - 现在我的吞吐量看起来很糟糕。

我的配置文件如下所示:(我发送到队列jmsP1EndPoint)

<broker:broker id="hexgenBroker" brokerName="hexgenBroker"
               persistent="false" useJmx="false" start="true">
    <broker:transportConnectors>
        <broker:transportConnector uri="vm://hexgenBroker" />
    </broker:transportConnectors>
    <broker:managementContext>
        <broker:managementContext createConnector="false" />
    </broker:managementContext>
    <broker:persistenceAdapter>
        <broker:kahaDB directory="activemq-data" journalMaxFileLength="32mb"   />
    </broker:persistenceAdapter>
    <broker:systemUsage>
        <broker:systemUsage>
            <broker:memoryUsage>
                <broker:memoryUsage limit="20 mb"/>
            </broker:memoryUsage>
            <broker:storeUsage>
                <broker:storeUsage limit="1 gb"/>
            </broker:storeUsage>
            <broker:tempUsage>
                <broker:tempUsage limit="200 mb"/>
            </broker:tempUsage>
        </broker:systemUsage>
    </broker:systemUsage>
</broker:broker>

<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="jmsDataSource">
    <property name="driverClassName" value="${driverClassName}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${dbusername}"/>
    <property name="password" value="${password}"/>
    <property name="testOnBorrow" value="true"/>
    <property name="testOnReturn" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="1800000"/>
    <property name="numTestsPerEvictionRun" value="3"/>
    <property name="minEvictableIdleTimeMillis" value="1800000"/>
    <property name="validationQuery" value="SELECT 1 FROM DUAL"/>
</bean>

<camel:camelContext id="hexContext" depends-on="hexgenBroker jms">
    <camel:endpoint id="p0EndPoint" pattern="InOut" uri="direct:p0" />
    <camel:endpoint id="jmsP1EndPoint" pattern="InOnly" uri="jms:queue:p1"  />
    <camel:endpoint id="dlq" pattern="InOnly" uri="jms:queue:ActiveMQ.DLQ"  />
    <camel:endpoint id="directP1EndPoint" pattern="InOnly" uri="direct:p1"/>
    <camel:route>
        <camel:from ref="p0EndPoint" />
        <camel:onException>
            <camel:exception>java.lang.Throwable</camel:exception>
            <camel:redeliveryPolicy logRetryStackTrace="false" logStackTrace="false"/>
        </camel:onException>

        <camel:to uri="class:com.hexgen.core.job.P0ContextHolder"/>
        <camel:to uri="bean:jobFactory"/>
        <camel:to uri="bean:jobPayloadTranslator"/>
        <camel:to uri="bean:jobPayloadEnricher"/>
        <camel:to uri="bean:jobPropertyValidator"/>
        <camel:to uri="bean:jobManager"/>
        <camel:to uri="bean:jobBusinessValidator"/>
        <camel:to uri="bean:jobInflightDataManager"/>
        <camel:to uri="bean:jobComplianceManager"/>
        <camel:to uri="bean:jobPayloadPersister"/>
        <camel:to uri="bean:jobEventTranslator"/>

    </camel:route>
    <camel:route>
        <camel:from ref="jmsP1EndPoint"/>
        <camel:to uri="bean:p1EntryPoint"/>
        <camel:transacted />
        <camel:to uri="class:com.hexgen.core.job.P1ContextHolder"/>
        <camel:to ref="directP1EndPoint" />
    </camel:route>
    <camel:route>
        <camel:from ref="dlq"/>
        <camel:to uri="bean:dlqEntryPoint"/>
    </camel:route>
    <camel:route>
        <camel:from ref="directP1EndPoint" />
        <camel:onException>
            <camel:exception>java.lang.Throwable</camel:exception>
            <camel:redeliveryPolicy logRetryStackTrace="false" logStackTrace="false"/>
            <camel:to uri="bean:p1Exception"/>
        </camel:onException>

        <camel:choice>
            <camel:when>
                <camel:jxpath>in/body/translationNeededAndIsNotReRouted</camel:jxpath>
                <camel:bean ref="eventToEventTranslator"/>
                <camel:to ref="directP1EndPoint"/>
            </camel:when>
            <camel:otherwise>
                <camel:dynamicRouter>
                    <camel:method ref="hexgenComponentRouter" method="route" />
                </camel:dynamicRouter>
            </camel:otherwise>
        </camel:choice>
    </camel:route>
</camel:camelContext>

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="vm://hexgenBroker" />
    <property name="redeliveryPolicy" ref="redeliveryPolicy" />
    <property name="prefetchPolicy" ref="prefetchPolicy" />
    <property name="alwaysSessionAsync" value="false" />
    <property name="useAsyncSend" value="true" />
</bean>

<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
    <property name="all" value="0" />
</bean>

<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
    <property name="maximumRedeliveries" value="0"/>
</bean>

<bean id="pooledConnectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean" init-method="init" destroy-method="close">
    <property name="uniqueResourceName" value="hexjms" />
    <property name="xaConnectionFactory" ref="jmsConnectionFactory" />
    <property name="minPoolSize" value="10"/>
    <property name="maxPoolSize" value="30"/>
    <property name="borrowConnectionTimeout" value="600"/>
</bean>

<bean id="jmsConfig"
      class="org.apache.activemq.camel.component.ActiveMQConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory" />
    <property name="maxConcurrentConsumers" value="30"/>
    <property name="concurrentConsumers" value="15" />
    <property name="transacted" value="true" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="cacheLevelName" value="CACHE_NONE"/>
    <property name="errorHandlerLogStackTrace" value="false"/>
    <property name="asyncStartListener" value="true"/>
    <property name="asyncConsumer" value="true"/>
    <property name="deliveryPersistent" value="false"/>
</bean>

<bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig" />
</bean>

<bean class="com.hexgen.p1.core.exceptions.P1ExceptionHandler" id="p1Exception">
</bean>

0 个答案:

没有答案