You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by j vh <jv...@hotmail.com> on 2022/10/07 00:47:02 UTC

JMS Component usage with Oracle Advanced Queue (AQ)

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);
    }
--------------------------------------------------------------------------------------