Skip to content

[FEATURE REQ] Change sender's default JmsConnectionFactory from ServiceBusJmsConnectionFactory to CachingConnectionFactory #47923

@rujche

Description

@rujche

Current behavior

Property (spring.jms.servicebus.pool.enabled and spring.jms.cache.enabled) not set or set to false Property (spring.jms.servicebus.pool.enabled or spring.jms.cache.enabled) set to true
sender side ServiceBusJmsConnectionFactory CachingConnectionFactory or JmsPoolConnectionFactory
receiver side ServiceBusJmsConnectionFactory CachingConnectionFactory or JmsPoolConnectionFactory

Expected behavior

Comment from @vinaysurya

If we don't use a CachingConnectionFactory on Sender side, I'm afraid when using JMSTemplate every send from Spring SDK will create and close a connection which will be very inefficient.

Property (spring.jms.servicebus.pool.enabled and spring.jms.cache.enabled) not set or set to false Property (spring.jms.servicebus.pool.enabled or spring.jms.cache.enabled) set to true
sender side CachingConnectionFactory CachingConnectionFactory or JmsPoolConnectionFactory
receiver side ServiceBusJmsConnectionFactory CachingConnectionFactory or JmsPoolConnectionFactory

Relate codes

  1. JmsListenerContainerFactory<?> jmsListenerContainerFactory(
    DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
    configurer.configure(jmsListenerContainerFactory, connectionFactory);
    jmsListenerContainerFactory.setPubSubDomain(Boolean.FALSE);
    configureCommonListenerContainerFactory(jmsListenerContainerFactory);
    return jmsListenerContainerFactory;
    }
    @Bean
    @ConditionalOnMissingBean(name = "topicJmsListenerContainerFactory")
    JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(
    DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
    configurer.configure(jmsListenerContainerFactory, connectionFactory);
    jmsListenerContainerFactory.setPubSubDomain(Boolean.TRUE);
    configureCommonListenerContainerFactory(jmsListenerContainerFactory);
    configureTopicListenerContainerFactory(jmsListenerContainerFactory);
    return jmsListenerContainerFactory;
    }
  2. public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
    BeanDefinitionRegistry registry) {
    BindResult<Boolean> poolEnabledResult = Binder.get(environment).bind("spring.jms.servicebus.pool.enabled", Boolean.class);
    BindResult<Boolean> cacheEnabledResult = Binder.get(environment).bind("spring.jms.cache.enabled", Boolean.class);
    if (isPoolConnectionFactoryClassPresent() && poolEnabledResult.orElseGet(() -> false)) {
    registerJmsPoolConnectionFactory(registry);
    return;
    }
    if (isCacheConnectionFactoryClassPresent() && cacheEnabledResult.orElseGet(() -> false)) {
    registerJmsCachingConnectionFactory(registry);
    return;
    }

Metadata

Metadata

Assignees

Labels

azure-springAll azure-spring related issuesazure-spring-jmsIssues related to Spring JMS.needs-triageWorkflow: This is a new issue that needs to be triaged to the appropriate team.

Projects

Status

Todo

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions