Hello, Using Camel 3.18.0 with Spring-boot 2.6.2 and consuming messages in a route from an Oracle Advanced queue.
Doing some performance testing consuming JMS messages that showed using a @JmsListener annotated receiver class and the Camel producer template was significantly faster than using a "regular" JMS component consumer route. (See some code snippets below for both cases). The JMS Component was configured to use a caching connection factory with 10 cached sessions and max 20 concurrent consumers. But the speed difference was like 2x slower when compared to the straight up Spring @JmsListener annotated class. Any thoughts? Is it possible to configure the Camel JMS component to use the Spring annotated @JmsListener message receiver class directly? (I mean with out using the producer template and a direct route component ?) I'm trying to figure out how to configure this, but not finding anything. Appreciate any help with this. Thanks, jvh -------------------------------------------------------------------------------------- /*** slower JMS Camel consumer route ***/ from("oracleaq:queue:myOracleAQ" + "?transacted=true" + "&lazyCreateTransactionManager=false" + "&jmsMessageType=Text" + "&exceptionListener=#aqInboundExceptionListener") -------------------------------------------------------------------------------------- /*** faster JMS Listener class ****/ @Component public class JmsOracleAqConsumer { @Autowired private ProducerTemplate producerTemplate; @JmsListener(destination = "myOracleAQ", containerFactory = "jmsListenerContainerFactory") public void receiveMessage(final TextMessage textMessage) throws JMSException { producerTemplate.sendBody("direct:fromOracleAq", textMessage.getText()); // but uses the producer template to send to a direct component } } /**** JMS Listener Container Factory Bean with 20 threads ****/ @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(final DataSource dataSource) throws JMSException { final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory(dataSource)); factory.setConcurrency("20"); factory.setSessionTransacted(true); factory.setCacheLevel(DefaultMessageListenerContainer.CACHE_CONSUMER); factory.setExceptionListener(aqInboundExceptionListener()); return factory; } /**** Connection factory bean ****/ @Bean public QueueConnectionFactory connectionFactory(final DataSource dataSource) throws JMSException { return AQjmsFactory.getQueueConnectionFactory(dataSource); } --------------------------------------------------------------------------------------