스프링부트

spring boot JMS activemq connection factory

알쓸개잡 2023. 9. 28.

Spring Boot 에서 제공하는 JMS activemq의 autoconfiguration에 의해서 사용되는 ConnectionFactory의 유형과 설정에 대해서 기록한다.

 

JmsPoolConnectionFactory

connection pool을 지원하는 connection factory 이다. JmsPoolConnectionFactory를 사용하기 위해서는 아래 조건이 충족되어야 한다.

  • org.messaginghub:pooled-jms 디펜던시 추가가 필요하다. 해당 아티팩트에 JmsPoolConnectionFactory 구현체가 있다.
  • spring.activemq.pool.enabled: true 가 설정되어야 한다.

CachingConnectionFactory

SingleConnectionFactory를 확장한 클래스로써 ActiveMQConnectionFactory를 wrapping 한다. CachingConnectionFactory를 사용하기 위해서는 아래 조건이 충족되어야 한다.

  • spring.activemq.pool.enabled: false 혹은 설정 항목이 없어야 한다.
  • spring.jms.cache.enabled: true (default: true) 혹은 설정 항목이 없어야 한다.

CachingConnectionFactory는 별도 설정이 없는 경우 디폴트로 동작한다.

 

ActiveMQConnectionFactory

ActiveMQConnectionFactory를 사용하기 위해서는 아래 조건이 충족되어야 한다.

  • spring.activemq.pool.enabled: false 혹은 설정 항목이 없어야 한다.
  • spring.jms.cache.enabled: false 가 설정되어야 한다.

위 세가지 ConnectionFactory는 사용자가 직접 설정한 ConnectionFactory가 없는 경우 autoconfiguration에 의해서 주입된다.

 

ActiveMQConnectionFactoryCustomizer

ActiveMQConnectionFactoryCustomizer를 구현하여 ActiveMQConnectionFactory를 커스텀하게 설정할 수 있다. ActiveMQConnectionFactoryCustomizer는 아래 추상 메소드를 가지는 FunctionalInterface이다.

void customize(ActiveMQConnectionFactory factory);

인자로 전달되는 ActiveMQConnectionFactory에 추가적인 설정을 할 수 있다.

ActiveMQConnectionFactoryCustomizer Bean을 생성하면 애플리케이션 기동시 ActiveMQConnectionFactoryCustomizer Bean의 customize가 호출 되며 이때 Bean으로 생성된 ActiveMQConnectionFactory가 customize의 인자로 전달된다.

아래 코드는 ActiveMQConnectionFactoryCustomizer Bean을 생성하는 샘플 코드다.

@Bean
public ActiveMQConnectionFactoryCustomizer activeMQConnectionFactoryCustomizer() {
    return activeMQConnectionFactory -> {
        //아래 코드에 ActiveMQConnectionFactory에 추가적인 셋팅을 할 수 있다.
        activeMQConnectionFactory.setWatchTopicAdvisories(false);
        activeMQConnectionFactory.setUseAsyncSend(true);
        activeMQConnectionFactory.setCheckForDuplicates(true);
        activeMQConnectionFactory.setDispatchAsync(true);
        activeMQConnectionFactory.setAlwaysSyncSend(true);
    };
}

 

JmsPoolConnectionFactory vs CachingConnectionFactory

모두 연결, 세션 및 메시지 프로듀서 인스턴스를 풀링하는 동일한 용도로 사용되지만 경우에 따라서 사용해야 하는 경우가 다르다.

  • ActiveMQ 클러스터링 환경을 구성하고 장애 처리 전송을 사용하는 경우 CachingConnectionFactory를 사용하지 않는 것이 좋다.
    • stackoverflow에 따르면 failover 접속 설정을 하더라도 한쪽 서버가 다운이 되면 failover 접속지도 연결이 되어야 하지만 failover 연결이 제대로 동작하지 않는다는 보고가 있다. JmsPoolConnectionFactory를 사용하면 해결이 된다고 함. 직접 재현 테스트까지 해보지는 않았다.
  • 향후에 JBoss MQ, WebSphere MQ와 같은 다른 브로커로 전환할 가능성이 있는 경우 ActiveMQ 코드와 결합도가 높은 JmsPoolConnectionFactory를 사용하지 않는 것이 좋다.

댓글

💲 추천 글