camel-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From northface01 <northfac...@gmail.com>
Subject Camel JMS Performance is ridiculously worse than pure Spring DMLC
Date Wed, 08 Aug 2012 15:31:50 GMT
I did a simple throughput test where I have about 3k large messages each has
a size of 1KB+ in a Solace JMS queue. I set up a simple camel route which
just consume the 3k messages and send them to a bean which simply logs the
message body. With this approach I was able to consume and log all messages
in 28-30 seconds, which translates to about 100 messages per second.
However, when I used a Spring DMLC to consume with the same bean as the
message listener which also simply logs the message body, I got all messages
consumed and logged in about 1 second, which is about 3k messages per
second. I understand camel-jms component is not designed with performance as
the top priority but this huge performance between camel-jms and spring DMLC
doesn't make any sense. I haven't got time to trace down the root cause of
this huge overhead by camel-jms myself. I would appreciate if someone who is
more familiar with camel-jms code can take a quick look at this issue. BTW, 
I was able to use the new camel-sjms component to consume the same 3k
messages in about 1.5 seconds which meets my throughput target so I didn't
have to fix camel-jms myself or write my own jms component. So kudos to the
developers of camel-sjms.

Here is my camel context:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring-2.9.2.xsd
       http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
       
	<context:load-time-weaver/>
	
	<bean id="placeholderProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:${camel.properties}"/>
		<property name="systemPropertiesModeName"
value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
		<property name="order" value="1"/>
	</bean>

	<camel:errorHandler id="noErrorHandler" type="NoErrorHandler"/>

	<bean id="shutdown" class="org.apache.camel.impl.DefaultShutdownStrategy">
		<property name="timeout" value="0"/>
	</bean>

	<bean id="msgTest" class="Test"/>
	
	<camel:camelContext id="steam-camel"
xmlns="http://camel.apache.org/schema/spring">
		<jmxAgent id="agent" disabled="true"/>
		<endpoint id="steam-solace"
uri="jms:${queue.name}?jmsMessageType=Text&amp;cacheLevelName=CACHE_CONSUMER"/>
		<route errorHandlerRef="noErrorHandler"
shutdownRunningTask="CompleteAllTasks">
			<from uri="ref:steam-solace"/>
			<to uri="bean:msgTest?method=onText"/>
		</route>
	</camel:camelContext>
	
	<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
		<property name="environment">
			<props>
				<prop key="java.naming.provider.url">${jms.provider.url}</prop>
				<prop key="java.naming.factory.initial">${jms.factory.initial}</prop>
				<prop
key="java.naming.security.principal">${jms.security.principal}</prop>
				<prop
key="java.naming.security.credentials">${jms.security.credentials}</prop>
				<prop key="Solace_JMS_JNDI_ClientID">${jms.client.id}-JNDI</prop>
				<prop key="Solace_JMS_VPN">${jms.solace.vpn}</prop>
			</props>
		</property>
	</bean>
	
	<bean id="jmsConnectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiTemplate" ref ="jndiTemplate"/>
		<property name="jndiName" value="${jms.connection.factory}"/>
	</bean>

	<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
		<property name="targetConnectionFactory" ref ="jmsConnectionFactory"/>
		<property name="sessionCacheSize" value="10"/>
		<property name="clientId" value="${jms.client.id}"/>
	</bean>

	<bean id="jmsConfig"
class="org.apache.camel.component.jms.JmsConfiguration">
		<property name="connectionFactory" ref="connectionFactory"/>
		<property name="asyncConsumer" value="true"/>
		<property name="disableReplyTo" value="true"/>
		<property name="acknowledgementModeName" value="DUPS_OK_ACKNOWLEDGE"/>
		<property name="concurrentConsumers" value="1"/>
		<property name="maxConcurrentConsumers" value="1"/>
		<property name="idleTaskExecutionLimit" value="1"/>
		<property name="idleConsumerLimit" value="1"/>
	</bean>
	
	<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
		<property name="configuration" ref="jmsConfig"/>
	</bean>
	
</beans>

Here is my Spring DMLC context:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring-2.9.2.xsd
       http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
       
	<context:load-time-weaver/>
	
	<bean id="placeholderProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:${camel.properties}"/>
		<property name="systemPropertiesModeName"
value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
		<property name="order" value="1"/>
	</bean>

	<bean id="msgListener" class="Test"/>
	
	<bean id="DMLC"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
	  <property name="cacheLevelName" value="CACHE_CONSUMER" />
 	  <property name="sessionTransacted" value="false" />
	  <property name="destinationName" value="${jms.queue.name}" />
	  <property name="connectionFactory" ref="connectionFactory" />
	  <property name="pubSubDomain" value="false" />
	  <property name="messageListener" ref="msgListener" />
        </bean>

	
	<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
		<property name="environment">
			<props>
				<prop key="java.naming.provider.url">${jms.provider.url}</prop>
				<prop key="java.naming.factory.initial">${jms.factory.initial}</prop>
				<prop
key="java.naming.security.principal">${jms.security.principal}</prop>
				<prop
key="java.naming.security.credentials">${jms.security.credentials}</prop>
				<prop key="Solace_JMS_JNDI_ClientID">${jms.client.id}-JNDI</prop>
				<prop key="Solace_JMS_VPN">${jms.solace.vpn}</prop>
			</props>
		</property>
	</bean>
	
	<bean id="jmsConnectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiTemplate" ref ="jndiTemplate"/>
		<property name="jndiName" value="${jms.connection.factory}"/>
	</bean>

	<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
		<property name="targetConnectionFactory" ref ="jmsConnectionFactory"/>
		<property name="sessionCacheSize" value="10"/>
		<property name="clientId" value="${jms.client.id}"/>
	</bean>
	
</beans>

Here is my Test bean which logs the messages:
public class Test implements MessageListener {
	private Logger logger = Logger.getLogger(Test.class);
	
	@Override
	public void onMessage(Message message) {
		try {
			logger.debug(((TextMessage)message).getText());
		} catch (Exception e) {
			logger.error(message, e);
		}
	}
	
	public void onText(String text) {
		logger.debug(text);
	}

}



--
View this message in context: http://camel.465427.n5.nabble.com/Camel-JMS-Performance-is-ridiculously-worse-than-pure-Spring-DMLC-tp5716998.html
Sent from the Camel Development mailing list archive at Nabble.com.

Mime
View raw message